security / sssdを使用してActive DirectoryをFreeBSD 10.0と統合する方法は?


回答:


14

すべてがすぐに機能するようにするには、注意が必要な考慮事項がいくつかあります。sssd現時点では、FreeBSDはバージョン1.9.6 のみをサポートしています。したがって、エンタープライズプリンシパル名はサポートされていません。

一致しないUPNを持つドメインがある場合、ログイン中に失敗します。これは、プロセス中にKerberos認証が失敗するためです。FreeBSDがKerberosでエンタープライズプリンシパル名をサポートしている場合でも、はsssdこのケースを処理できません。

したがって、実際のバージョンでsssdは、ユーザープリンシパル名は同じドメイン名内に制限されています。次に例を示します。

Domain Name = example.com
NetBIOS Name = EXAMPLE
User Principal Name:
username@example.com sAMAccountName: username

これを知っていれば、FreeBSDでADからユーザーを認証する手順を説明できます。

1. Kerberosを構成する

/etc/krb5.conf次の内容のファイルを作成します。

[libdefaults]
    default_realm = EXAMPLE.COM
    dns_lookup_realm = true
    dns_lookup_kdc = true
    ticket_lifetime = 24h
    renew_lifetime = 7d
    forwardable = yes

2. Samba 4.1をインストールし、ドメインに参加するように構成します

Samba 4.1をインストールします。

$ pkg install samba41

/usr/local/etc/smb4.conf次の内容のファイルを作成します。

[global]
    security = ads
    realm = EXAMPLE.COM
    workgroup = EXAMPLE

    kerberos method = secrets and keytab

    client signing = yes
    client use spnego = yes
    log file = /var/log/samba/%m.log

管理者のKerberosチケットを要求します。

$ kinit Administrator

次に、ドメインに参加してキータブを作成します

$ net ads join createupn=host/server-hostname.example.com@EXAMPLE.COM -k
$ net ads keytab create -k

3. Kerberosサポート付きのsssdパッケージとCyrus SASLをインストールします

必要なパッケージをインストールします。

$ pkg install sssd cyrus-sasl-gssapi

/usr/local/etc/sssd/sssd.confこの設定と一致するようにファイルを編集します。

[sssd]
    config_file_version = 2
    services = nss, pam
    domains = example.com

[nss]

[pam]

[domain/example.com]
    # Uncomment if you need offline logins
    #cache_credentials = true

    id_provider = ad
    auth_provider = ad
    access_provider = ad
    chpass_provider = ad

    # Comment out if the users have the shell and home dir set on the AD side
    default_shell = /bin/tcsh
    fallback_homedir = /home/%u

    # Uncomment and adjust if the default principal SHORTNAME$@REALM is not available
    #ldap_sasl_mech = GSSAPI
    #ldap_sasl_authid = SERVER-HOSTNAME$@EXAMPLE.COM

4. nsswitch.confにsssdサポートを追加します

/etc/nsswitch.confこの設定と一致するようにファイルを編集します。

group: files sss
passwd: files sss

5. PAMを構成して、sssd認証を許可し、ホームディレクトリの作成を処理する

ホームディレクトリ作成用のオプションパッケージをインストールします。

$ pkg install pam_mkhomedir

PAMこの設定に一致するように必要なレルムを変更します。

auth            sufficient      /usr/local/lib/pam_sss.so
account         required        /usr/local/lib/pam_sss.so        ignore_unknown_user
session         required        /usr/local/lib/pam_mkhomedir.so  mode=0700
session         optional        /usr/local/lib/pam_sss.so
password        sufficient      /usr/local/lib/pam_sss.so        use_authtok

6. SASL対応のOpenLDAPクライアントに切り替えます

$ pkg remove -f openldap-client
$ pkg install openldap-sasl-client

7.最後に、すべてが機能していることを確認します

$ getent passwd <username>

OpenBSD-sasl-clientをインストールすると、pkgがsssd、ldb、およびsamba44を削除するFreeBSD 10.3の解決策はありますか?あなたの答えを使うとき、私はとても近くにいるように感じますが、私はこの一部にこだわっています。
bgStack15

2

ここではどのKerberosを使用していますか?組み込みの1つまたはMITのsecurity / krb5?

sssdをインストールするときは、現時点ではまだFreeBSDで実験的と見なされているsecurity / krb5をインストールする必要があります。したがって、この質問。

'getent'コマンドを実行するときに、ADユーザー/グループを取得することができません。これは、NETBIOS名がドメイン名と異なるためである可能性があります。つまり、私の場合、ドメイン名はdawnsign.comで、NETBIOS名はDSPです。

pam.dログインモジュールのみを設定しました。認証を成功させるために、他にどのpamモジュールを編集する必要がありますか?

追加情報をいただければ幸いです。


ベースからHeimdal Kerberosを使用しています。MIT Kerberosポートをインストールしていません。
ヴィニシウスFerrão

1

ポートからsamba4を再コンパイルすると、sssdがなくてもLinuxのようなwinbind認証を使用できます。sasl ldapを有効にした後、ポートからsamba4を再コンパイルするだけです

    pkg remove samba41 
    pkg install cyrus-sasl-gssapi samba36-libsmbclient pam_mkhomedir ldb 
    pkg remove -f openldap-client 
    pkg install openldap-sasl-client 
    cd /usr/ports/security/sssd && make install

これは、必要なすべてのサポート(gssapi、ldap、kerberos)でsambaを再コンパイルし、nsswitch.confを次のように編集します

passwd: files winbind
group: files winbind

ネイティブKerberosを使用できるのに、なぜwinbindとsambaを使用するのですか?
ヴィニシウスFerrão

Active Directoryユーザーの場合、kerberosはパスワードとsso用です
elbarna

0

こんにちは、

これは、sssd v1.11.7の使用に関する小さな更新です

「id_provider = ad」を使用している場合、sssdログファイルに次のエラーが表示されます。

/var/log/sssd/sssd_example.com.log
(Sun Oct  5 18:41:37 2014) [sssd[be[alidaho.com]]] [sasl_bind_send] (0x0020): ldap_sasl_bind failed (-12)[Not Supported]
(Sun Oct  5 18:41:37 2014) [sssd[be[alidaho.com]]] [sasl_bind_send] (0x0080): Extended failure message: [unknown error]

次の手順を使用してこの問題を解決し、AD統合を正しく機能させることができます。Sambaをサポートするsssd v1.11.7をビルドします。srcsssdからビルドする必要があるため、libsasl2とリンクします

​pkg remove samba41
pkg install cyrus-sasl-gssapi samba36-libsmbclient pam_mkhomedir ldb
pkg remove -f openldap-client
pkg install openldap-sasl-client
cd /usr/ports/security/sssd && make install

samba41を削除する目的は何ですか?samba36でのみ機能しますか?私はこの正確な問題を抱えていますが、必要がない場合は3.6に戻したくありません。
MikeyB 2015年

samba41バイナリを削除してから、samba41をポートから再コンパイルします(sssdで要求されます)。私の場合(新しい10.1インストール)samba41バイナリが機能しません。portsによってコンパイルされたsamba41は完全に機能します
elbarna

0

これが、この記事の執筆時点(2017年6月)での、SSSDを介したこれらのバージョンのFreeBSDとのAD統合に関する私のガイドです。

  • FreeBSD 10.3および11.0(10.3-RELEASE-p18および11.0-RELEASE-p9)
  • インストール(および楽しいパッケージングと依存関係の問題)

    • 必要なパッケージはHeimdal Kerberosと互換性がないようです。そのため、MIT Kerberosフラグを有効にしてインストールおよびコンパイルする必要があります。これは、実際の互換性の問題よりも、パッケージの依存関係の問題である可能性があります。
    • Heimdalは基本システムと共にインストールされるため、MIT Kerberosをインストールする場合、1セットは/usr/binに、もう1セットはにインストールすると、2セットのKerberosコマンド が残り/usr/local/binます。基本システムファイルはパッケージに含まれていないようなので、Heimdal KRBを単純に削除することはできません。知っておくべきこと。
    • さまざまなパッケージの前方依存関係(太字の興味深いdep、太字の斜体の矛盾するdep):

      • net-mgmt/adcli:net/openldap24-sasl-client
      • security/cyrus-sasl2-gssapi: security/cyrus-sasl2
      • net/openldap24-sasl-client: security/cyrus-sasl2
      • security/sssd: security/nss
      • security/sssd:security/krb5
      • security/sssd: security/cyrus-sasl2
      • security/sssd:net/openldap24-client
      • security/sssd: lang/python27
      • security/sssd: lang/python2
      • security/sssd: dns/c-ares
      • security/sssd: devel/tevent
      • security/sssd: devel/talloc
      • security/sssd: devel/popt
      • security/sssd: devel/pcre
      • security/sssd: devel/libunistring
      • security/sssd: devel/libinotify
      • security/sssd: devel/gettext-runtime
      • security/sssd: devel/ding-libs
      • security/sssd: devel/dbus
      • security/sssd: databases/tdb
      • security/sssd: databases/ldb
    • さまざまなパッケージの依存関係を逆にします。

      • net/openldap24-sasl-client: sysutils/msktutil
      • net/openldap24-sasl-client: net/nss-pam-ldapd-sasl
      • net/openldap24-sasl-client: net-mgmt/adcli
        • sssd基本パッケージとしてHeimdalを使用しているにもかかわらず、MIT Kerberosが必要であることがわかります。
        • adcliが望んopenldap-sasl-clientでいますが、他のパッケージ(のサブ依存関係を含むsssdopenldap-clientはを取り込みます。これは、sasslクライアントとのミューテックスです(どんな愚かな理由でも)。これにより、最小限のバイナリパッケージセットであっても、インストールが少し面倒になります。
        • これらの依存関係は、バイナリレポパッケージと、パッケージがポートツリーでビルドされている場合の両方に存在します。これには、必要なすべてを取得するための煩わしい特定のインストール方法が必要です(以下で説明)。
    • これを書いている時点では、FreeBSD用のSSSDのバイナリpkgには、SSSDでのADサポートは含まれていません。

      • SSSDのポートバージョンは、適切な(make config)オプションを有効にしてビルドする必要がありました。
        • SMB
      • SSSDはまた、openldap-sasl-clientが正しく機能するために本当に必要なときに、openldap-clientを取り込みたいと考えています。
    • のpkgバイナリバージョンがadcli存在しますが、これを書いている時点では機能しません。
      • ここでも、portsバージョンは適切なオプションを有効にしてコンパイルされています。
        • GSSAPI_MIT
    • cyrus-sasl-gssapi が必要ですが、pkgバイナリバージョンは機能せず、SSSDを削除する原因となる奇妙な依存関係の問題があります。
      • MIT-KRB5オプションを有効にして、ポートからビルドします。
        • GSSAPI_MIT
    • openldap-sasl-client 機能には必須ですが、SSSDはopenldapのSASL以外のバージョンを取り込みたいと考えています。
      • これを機能させるには
        • ポートでオプションを選択openldap-sasl-clientして構成しGSSAPIます(make config)。
        • それをビルドするためにmake in portsを実行します
        • インストールする前に、 pkg remove –f openldap-client
          • これopenldap-clientにより、他のパッケージ(SSSDなど)の自動削除を行わずに削除され、SASLバージョンのインストールが可能になります
        • のインストールを行います openldap-sasl-client
          • これはシステムにインストールされます
    • これにより、AD機能を備えた機能的なSSSDに必要なものが提供されます。
    • SSSDをポートからコンパイルする場合、依存関係の多くを取り込むため、ビルドが行われ、構成オプションを選択する必要があることに注意してください。
      • 最初にpkg install sssdでバイナリパッケージをインストールし、次にそれを削除することをお勧めします pkg remove –f sssd
        • これにより、SSSDを取り込む必要のあるほとんどのバイナリパッケージが生成され、これらの依存関係をすべてビルドする必要がなくなります。これにはかなり時間がかかります。
      • 削除したら、上記のオプションを有効にしてポートからSSSDを再インストールします。これにより、上記の4つのパッケージを再ビルドするだけで機能するセットアップを取得できます。
    • (オプション)すべてが機能し、検証されたらpkg create、適切なオプションを有効にして4つのパッケージのバイナリパッケージを作成し、すべてのシステムのポートでビルドする代わりにそれらを使用できます。バイナリのインストールは、portsビルドプロセスと同様のパターンに従います。

      • pkg install sssd-1.11.7_8.txz
        • もちろんあなたのバージョンは違うかもしれません
        • これにより、SSSDのバイナリパッケージがインストールされ、必要なすべてがFreeBSDリポジトリから取得されます。
      • pkg add 他のパッケージ(インストール、追加以外)。openldapパッケージを最後に保存します。
      • 追加する前にopenldap-sasl-clientDO aをpkg remove –f openldap-client
        • これにより、SASL以外のバージョンが削除され、バージョンをインストールできるようになります
      • pkg add openldap-sasl-client-2.4.44.txz
        • 繰り返しますが、バージョンは異なる場合があります
      • 必要なパッケージをインストールしておく必要があります。
      • 可能行う前に、SSSDバイナリのメタデータを変更することは可能pkg createで依存関係を交換するopenldap-clientopenldap-sasl-client、この削除/再インストールを行う必要性を取り除くために。これを検討する時間はありませんでした。
        • さらに、SSSDのサブ依存関係もありopenldap-client、これらも依存する ため、それらも修正する必要があります。
      • これらの注意事項はすべて、この記事の執筆時点で現在ポートツリーにあるこれらのパッケージのバージョンと、それらに関連付けられている依存関係に関するものであることに注意してください。FreeBSDがポートツリーとバイナリを更新するため、これはすべて変更される可能性があります。多分いつの日か、すべてのバイナリバージョンがあり、AD機能用に構成された適切なオプションを使用して、適切な依存関係をすべてすぐに利用できるようになります。
    • Kerberos構成:

      • /etc/krb5.confファイルのサンプル:
[libdefaults]
   default_realm = MYDOMAIN.NET
   forwardable = true
#DNS SRVレコードなので、通常、AD環境で必要なすべてのもの
#AD / KRBサーバー/サービスを識別します。もしあなたがコメントアウト
#手動でADサーバーを指定する
dns_lookup_kdc = true
[レルム]
   MYDOMAIN.NET = {
#DNSにあるものとは異なるADサーバーを手動で指定している場合
#admin_server = adserver.mydomain.net
#kdc = adserver.mydomain.net
   }
[domain_realm]
   mydomain.net = MYDOMAIN.NET
   .mydomain.net = MYDOMAIN.NET
  • (インデント)
    • SSSD設定:
      • この例では、ユーザーとグループのADのPOSIX属性を想定しています。これは、UIDとGIDがすでに確立されている既存の環境を置き換える場合に一般的に必要です。
      • /usr/local/etc/sssd/sssd.confファイルのサンプル:
[sssd]
config_file_version = 2
ドメイン= MYDOMAIN.NET
services = nss、pam、pac
fallback_homedir = / home /%u

[ドメイン/MYDOMAIN.NET]
id_provider = ad
access_provider = ad
auth_provider = ad
chpass_provider = ad
#AD POSIX属性を使用、自動生成を使用している場合はコメント化
#UIDとGID。
ldap_id_mapping = False
cache_credentials = true
ad_server = adserver.mydomain.net
#bash、またはADアカウントのloginShellに何もない場合
#インストールされた属性
override_shell = / bin / tcsh
  • (インデント)
    • PAM構成:
      • FreeBSDでのPAM設定は、OpenPAMの動作方法のため、少し注意が必要です。詳細は説明しませんが、SSSDにpam_sssを使用して機能させ、passwdログインも機能させるには、pam_unixをファイルに2回入力する必要があります。私が理解していることから、これは、2番目のpam_unixモジュールを渡すことを必要とする「舞台裏で」実行される二次チェックに関係しています。
        • これは、/etc/pam.dSSSDをFreeBSDで動作させるために変更しなければならなかったファイルのリストです。

/etc/pam.d/sshd:

#
#$ FreeBSD:releng / 11.0 / etc / pam.d / sshd 197769 2009-10-05 09:28:54Z des $
#
#「sshd」サービスのPAM構成
#

#auth
auth十分なpam_opie.so no_warn no_fake_prompts
auth requisite pam_opieaccess.so no_warn allow_local
#auth十分なpam_krb5.so no_warn try_first_pass
#auth十分なpam_ssh.so no_warn try_first_pass
auth十分なpam_unix.so no_warn try_first_pass nullok
auth十分なpam_sss.so use_first_pass
authが必要ですpam_unix.so no_warn use_first_pass

#アカウント
アカウントに必要なpam_nologin.so
#account required pam_krb5.so
アカウントに必要なpam_login_access.so
アカウントに必要なpam_unix.so
アカウント十分なpam_sss.so

#セッション
#sessionオプションのpam_ssh.so want_agent
セッションオプションのpam_sss.so
セッションに必要なpam_mkhomedir.so mode = 0700
セッションにはpam_permit.soが必要

#パスワード
#password十分なpam_krb5.so no_warn try_first_pass
#password十分なpam_unix.so try_first_pass use_authtok nullok
パスワード十分なpam_unix.so try_first_pass use_authtok
パスワード十分なpam_sss.so use_authtok

/etc/pam.d/system:

#
#$ FreeBSD:releng / 11.0 / etc / pam.d / system 197769 2009-10-05 09:28:54Z des $
#
#システム全体のデフォルト
#

#auth
auth十分なpam_opie.so no_warn no_fake_prompts
auth requisite pam_opieaccess.so no_warn allow_local
#auth十分なpam_krb5.so no_warn try_first_pass
#auth十分なpam_ssh.so no_warn try_first_pass
#auth required pam_unix.so no_warn try_first_pass nullok
auth十分なpam_unix.so no_warn try_first_pass
auth十分なpam_sss.so use_first_pass
authが必要なpam_deny.so

#アカウント
#account required pam_krb5.so
アカウントに必要なpam_login_access.so
アカウントに必要なpam_unix.so
アカウント十分なpam_sss.so

#セッション
#sessionオプションのpam_ssh.so want_agent
セッションにはpam_lastlog.so no_failが必要
セッションオプションのpam_sss.so
セッションに必要なpam_mkhomedir.so mode = 0700

#パスワード
#password十分なpam_krb5.so no_warn try_first_pass
#password required pam_unix.so no_warn try_first_pass
パスワード十分なpam_unix.so no_warn try_first_pass nullok use_authtok
パスワード十分なpam_sss.so use_authtok
#password必須pam_deny.so

/etc/pam.d/su:

#
#$ FreeBSD:releng / 11.0 / etc / pam.d / su 219663 2011-03-15 10:13:35Z des $
#
# "su"サービスのPAM構成
#

#auth
auth十分なpam_rootok.so no_warn
十分な認証pam_self.so no_warn
auth requisite pam_group.so no_warn group = wheel root_only fail_safe ruser
auth include system.dist

#アカウント
アカウントにはsystem.distが含まれます

#セッション
セッションにはpam_permit.soが必要
  • (インデント)

    • ノート:
      • system.dist在庫/etc/pam.d/systemファイルのコピーです。/etc/pam.d/susuコマンドの問題を防ぐために、上記のファイルに含まれています。
      • 一つは、まだすることができますsuルートと、以降、ルートとしてアカウントADにsu認証する必要はありませんし、アカウント情報がSSSDを経由して、ネームサービススイッチを通して引っ張られます。
      • あるユーザー(rootではない)から別のユーザーに本当に切り替えたい場合はsudo、セキュリティ上の理由からのみ使用する必要があります
      • ksuユーザーAからユーザーBへの切り替えにも使用できます。
        • Heimdalのksu(内の/usr/bin)にはデフォルトでSUIDが設定されていません
          • ハイムダルを機能させるにksuchmod u+s /usr/bin/ksu
        • MIT Kerberos(にkrb5インストールされたパッケージ/usr/local/bin)はインストール時にSUIDです
      • Heimdalは基本パッケージの一部であるため、Kerberosバイナリの両方のセットが含まれます。
        • デフォルトのパスを調整して/usr/local/binから/usr/bin、などになるようにすることができます。
      • ksu ターゲットユーザーのAD / Kerberosパスワードをユーザーに要求します
      • passwdpam_sss.sopasswd PAMファイルに追加しても、AD / Kerberosパスワードの変更は機能しません。passwdバイナリは、ローカルとNISの使用をサポートkpasswdAD / Kerberosサーバ(複数可)のパスワードを変更します。
    • ネームサービススイッチ:

      • この/etc/nsswitch.confファイルは、passwdとグループにsssサービスを使用するように構成する必要があります。例:
        • group: files sss
        • passwd: files sss
    • ドメインに参加する:

      • Linuxボックスに参加する* nixには2つの主要なツールがあります
        • adcli
          • これは私の好みのツールです。これは非常にうまく機能し、すべてを単一のコマンドラインで実行できます。資格情報は非対話的に(stdinなどを介して)与えることができます
          • kinit使用する前に行う必要はありません、それは提供された信用に基づいてあなたのために行います。
            • 例:
              • adcli join -D mydomain.net -U Administrator--show-details –v
              • adcli join –H adclient.mydomain.net -D mydomain.net -U Administrator --show-details -v
                • ユーティリティは常にFQDNを正しく把握しているわけではないため、この形式をお勧めします。ホストのフォワードDNSとリバースDNSの両方に一致するFQDNを提供すると、原則が正しく作成されます。ユーティリティが誤ったホスト名(たとえば、DNSドメインを含まない)を使用する場合、一部のサービスプリンシパルが作成されず、ホストへのSSHなどが失敗する可能性があります。
        • Samba netユーティリティ
          • netユーティリティは、Sambaスイートの一部です。
          • このユーティリティでは、smb.conf構成ファイルでドメインの詳細を設定する必要があるため、特に非対話的に使用することがより困難で不便になります。
          • このツールでは、を使用して使用する前に、Kerberosチケットを取得する必要もありますkinit。繰り返しますが、これはより不便であり、1つのステップではなく2つのステップがあるため、スクリプトで非インタラクティブに使用することが少し難しくなります。
    • SSHDの考慮事項:

      • SSHDをADおよびSSSDと連携させることは、通常、かなり簡単です
      • 次のオプションを追加する必要があります /etc/ssh/sshd_config
        • GSSAPIAuthentication yes
          • SSHDのGSS API認証をオンにします。これにより、SSHDはAD KDCに対して認証されます
        • PasswordAuthentication yes
          • ユーザーがパスワードでログインできるようにします。ユーザーがログイン時にKRB5チケットを取得する場合に必要です。これを有効にしないと、システムはKDCから送信されたTGTを復号化できません。
        • ChallengeResponseAuthentication yes
          • FreeBSDの場合、この方法が最も効果的です。
            • PasswordAuthentication noこのオプションを使用する場合は、必ず構成してください。
            • これは、ログイン時に有効期限が切れたパスワードを変更するように機能する、FreeBSDで見つけた唯一の方法です。もう一方を使用すると/bin/passwd、が呼び出され、NISとローカルのpasswdファイル以外はサポートされません。
        • GSSAPICleanupCredentials yes
          • (オプション)kdestroyログアウト時に実行します
        • GSSAPIStrictAcceptorCheck no
          • (オプション)SSHDが独自のホスト名について混乱している場合、またはマルチホームなどである場合、または別のサービスプリンシパルを使用してKDCと通信する場合、このオプションが必要になることがよくあります。通常、SSHDはサービスプリンシパルhost/<FQDN>@REALMを使用してKDCと通信しますが、時々それが間違ってしまいます(たとえば、ホスト名がSSHサーバーのDNS名と一致しない場合)。このオプションにより、SSHDは/etc/krb5.keytabファイル内の任意のプリンシパルを使用できます。host/<FQDN>@REALM
      • 使用するオプションの組み合わせに応じて、ホストのIPv4アドレスとIPv6アドレスをKDCに追加ssh -K <ip>して、パスワードのプロンプトを表示せずに機能するようにする必要がある場合とない場合があります(すでに「kinit」を実行していることを前提とします)。もちろん)。

これが人々の役に立つことを願っています。これは基本的に、FBSD10と11をSSSDとADサーバーで動作させようとしているときに、私のメモからコンパイルされます。私が遭遇した最大の問題はPAM構成でした。これは本当に不安定で、Linux(openpamのバグ?)でのように機能せず、パッケージング/依存関係にありました。別の方法がある場合は、遠慮なくコメントしてください。特に、ViníciusFerrãoのように組み込みのHeimdal Kerberosで動作させると、彼のAnswerのように見えます。とにかく、SSSDはMIT krb5パッケージの導入を要求しているため、私は試しませんでした。
jbgeek 2017

pam.dに関する更新。私はopenpamの不安定さの理由を発見し、その修正を見つけました(pam_unixモジュールを2回使用して、ログインが成功するために必要な「非表示」テストに合格する)。
jbgeek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.