●Active Directory連携
winbind機能を利用するとWindowsサーバに登録されたユーザ情報やパスワードを利用することが可能となるため、Linux側にSamba用のアカウントを作成することなくWindowsのユーザアカウントをLinux上で利用することが可能となります。ActiveDirectoryと連携してドメインメンバーサーバとする手順について以下に説明します。
Sambaドメイン構成のうちActive Directoryとしてドメイン参加することが可能です。この場合、ユーザ認証にはKerberosが利用されます。Linuxでは一般的にMIT Kerberosが実装として利用されています。
ここではWindows Server2003で運用中のActive DirectoryドメインにSambaサーバを参加させるための設定方法に関して説明いたします。
Windows Server 2003 | |
Active Directoryドメイン | ad-domain.local |
コンピュータ名 | test |
IPアドレス | 192.168.1.200 |
Sambaサーバ | |
コンピュータ名 | SAMBA |
IPアドレス | 192.168.1.151 |
まず最初にSambaがActiveDirectoryに対応としてビルドされていることを確認します。OpenLDAPとKerberosのライブラリが必要ですがこれらのライブラリが存在していれば自動的にActiveDrirectory機能が利用可能となります。lddでsmbdにリンクされるライブラリを確認することでActiveDirectory連携が利用可能かどうか判別することができます。
# ldd /usr/sbin/smbd linux-gate.so.1 => (0xffffe000) libldap_r.so.2 => /usr/lib/libldap_r.so.2 (0xb7efe000) liblber.so.2 => /usr/lib/liblber.so.2 (0xb7ef2000) libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0xb7ed6000) libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0xb7e5a000) libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0xb7e35000) libcom_err.so.2 => /lib/libcom_err.so.2 (0xb7e31000) libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0xb7e2c000) libresolv.so.2 => /lib/tls/i686/cmov/libresolv.so.2 (0xb7e19000) libcups.so.2 => /usr/lib/libcups.so.2 (0xb7dea000) libgnutls.so.13 => /usr/lib/libgnutls.so.13 (0xb7d7c000) libz.so.1 => /usr/lib/libz.so.1 (0xb7d68000) libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7d55000) libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7d30000) libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0xb7d02000) libpam.so.0 => /lib/libpam.so.0 (0xb7cfa000) libattr.so.1 => /lib/libattr.so.1 (0xb7cf6000) libacl.so.1 => /lib/libacl.so.1 (0xb7cf0000) libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb7cd9000) libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7cd5000) libpopt.so.0 => /lib/libpopt.so.0 (0xb7ccd000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7b9c000) libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0xb7b86000) libtasn1.so.3 => /usr/lib/libtasn1.so.3 (0xb7b72000) libgcrypt.so.11 => /usr/lib/libgcrypt.so.11 (0xb7b21000) libgpg-error.so.0 => /usr/lib/libgpg-error.so.0 (0xb7b1d000) /lib/ld-linux.so.2 (0xb7f3b000) |
事前準備としてDNSサーバをADに向けておく必要があります。
# vi /etc/resolv.conf search ad-domain.local nameserver 192.168.1.200 |
ADではKerberos認証が機能するため、時刻を正確に合しておく必要があります。AD環境ではクライアントは原則としてドメインコントローラと時刻同期をするらしい。Windows2003において以下のコマンドをDOS窓からたたいて時刻を同期しておきます。
net time /setsntp:[ntpサーバのIPアドレス],0x1 net stop w32time net start w32time w32tm /resync |
AD連携機能を利用するための基本的な設定例を示します。
[global] dos charset = CP932 display charset = UTF-8 netbios name = SAMBA server string = %h server obey pam restrictions = Yes workgroup = AD-DOMAIN realm = AD-DOMAIN.LOCAL security = ads password server = TEST.AD-DOMAIN.LOCAL idmap uid = 30000-40000 idmap gid = 30000-40000 winbind enum groups = yes template homedir = /home/%U template shell = /bin/bash winbind enable local accounts = yes winbind use default domain = no winbind separator = + winbind cache time = 120 obey pam restrictions = yes |
以下にwinbindに関連するsmb.confのパラメータとその意味を示します。
realm | ADのドメイン名を指定します。これは全て大文字で設定します |
workgroup | NTドメイン形式のドメイン名を利用するためにADサーバで設定 しているNTドメインのNetBIOS名を設定します |
security | AD連携機能を利用するときにはadsを指定します |
password server | ドメインコントローラを指定します。 |
idmap uid | winbindはWIndowsドメインコントローラから取得した情報を 元にLinux用のユーザアカウントを自動作成します。自動で作成 されるアカウントはwinbindによって管理されており/etc /passwdなどには現れません。またwinbindはユーザ情報を作 成するときにidmap uidにパラメータに指定した範囲のUIDを小 さい値から順番に割り当てます。従って既存のユーザアカウン トに割り当てられていないUIDの範囲で指定しなければなりま せん。 |
idmap gid | idmap uidと同様で自動的に作成されるグループに関する値の 範囲を指定します。 |
winbind enum users | ドメインコントローラに非常に多くのユーザが登録されている 場合、エントリの取得に時間がかかることがありますwinbindは ネットワークごしにユーザエントリを取得するためネットワー ク帯域幅がせまくユーザ数が多数に渡る場合など、ユーザ一覧 取得処理にかかる時間が無視できないものになることもありま す。このような環境でユーザ一覧の取得時に一覧の取得を抑制 するためのパラメータです。noを設定するとユーザ一覧の取得 を抑制します。 |
winbind enum groups | winbind enum groupsと同様のパラメータでnoを指定した 場合、グループ一覧の取得を抑制します。 |
template homedir | winbindによって自動的に作成されたユーザのホームディレクト リの初期パラメータとして割り当てられます。規定値は/home /%D/%Uと設定されているため/home/ドメイン名/ユーザ名が ホームディレクトリとして割り当てられます。 |
template shell | winbindによって自動的に作成されたユーザのログインシェルの 初期パラメータとして割り当てられます。規定値は/bin/falseが 設定されているためwinbindによって自動的に作成されたユーザ はシステムにログインすることができません。 |
winbind enable local accounts | このパラメータをyesに設定するとwinbindはユーザ作成要求が 発生したときにwinbind独自のデータベース内にユーザアカウン トを自動的に作成します。これと同時にadd user scriptなど、 ユーザ作成などに関する一部のパラメータは無視されます。 |
winbind separator | winbind機能を用いいるとWindowsドメインコントローラから 取得したユーザ情報はデフォルトでドメイン名\ユーザ名の形 式で表現されます。しかしLinuxではバックスラッシュは特別な 意味をもつことが多いので運用上あまり好ましくありません。 そこでバックスラッシュを他の文字に置き換えたい場合にこの パラメータに置き換える文字を指定します。 |
winbind use default domain | このパラメータをyesにするとwinbindによって作成されたユー ザ名からドメイン名が取り除かれます。その結果、sshなど samba以外のアプリケーションでwinbind経由で取得したユー ザ名を利用する場合にもドメイン名が含まれないため一般的な ユーザ名でログインすることが可能となり、ユーザの利便性が 向上します。 |
winbind cache time | winbindは性能向上のためにユーザ情報やグループ情報をキャッ シュとして保持しています。このパラメータはキャッシュを保 持する時間であり、指定した時間を過ぎて問い合わせがあると 再度ドメインコントローラから情報を取得します。 |
続いてKerberos認証を利用するためにMIT Kerberosの設定を行います。Kerberosの設定は/etc/krb5.confにて行います。パラメータを以下に示します。
default_realm | ADのドメイン名を設定します。 smb.confのrealmのと同じ値を全て大文字で記載します |
[realms] | Kerberosに関する情報を格納するセクションです。 どのれるむに関する設定か指定します |
kdc | レルムでチケットの発行を行うサーバを指定します。 チケットはKerberosのユーザ認証に利用されます。 ADのDCに該当しFQDNの形式で利用されます |
[domain_realms] | DNS名とレルムのマッピングを設定します |
AD連携に必要なkrb5.confの設定は次のようになります。
# more /etc/krb5.conf [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = AD-DOMAIN.LOCAL dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h forwardable = yes [realms] # EXAMPLE.COM = { # kdc = kerberos.example.com:88 # admin_server = kerberos.example.com:749 # default_domain = example.com # } AD-DOMAIN.LOCAL = { kdc = test.ad-domain.local } [domain_realm] # .example.com = EXAMPLE.COM # example.com = EXAMPLE.COM ad-domain.local = AD-DOMAIN.LOCAL .ad-domain.local = AD-DOMAIN.LOCAL [appdefaults] pam = { debug = false ticket_lifetime = 36000 renew_lifetime = 36000 forwardable = true krb4_convert = false } |
/etc/nsswitch.confを編集します。
# more /etc/nsswitch.conf # # /etc/nsswitch.conf # # An example Name Service Switch config file. This file should be # sorted with the most-used services at the beginning. # # The entry '[NOTFOUND=return]' means that the search for an # entry should stop if the search in the previous entry turned # up nothing. Note that if the search failed due to some other reason # (like no NIS server responding) then the search continues with the # next entry. # # Legal entries are: # # nisplus or nis+ Use NIS+ (NIS version 3) # nis or yp Use NIS (NIS version 2), also called YP # dns Use DNS (Domain Name Service) # files Use the local files # db Use the local database (.db) files # compat Use NIS on compat mode # hesiod Use Hesiod for user lookups # [NOTFOUND=return] Stop searching if not found so far # # To use db, put the "db" in front of "files" for entries you want to be # looked up first in the databases # # Example: #passwd: db files nisplus nis #shadow: db files nisplus nis #group: db files nisplus nis passwd: files winbind shadow: files winbind group: files winbind #hosts: db files nisplus nis dns hosts: files dns # Example - obey only what nisplus tells us... #services: nisplus [NOTFOUND=return] files #networks: nisplus [NOTFOUND=return] files #protocols: nisplus [NOTFOUND=return] files #rpc: nisplus [NOTFOUND=return] files #ethers: nisplus [NOTFOUND=return] files #netmasks: nisplus [NOTFOUND=return] files bootparams: nisplus [NOTFOUND=return] files ethers: files netmasks: files networks: files protocols: files rpc: files services: files netgroup: files publickey: nisplus automount: files aliases: files nisplus |
PAMの設定を行います。
# more /etc/pam.d/system-auth #%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet auth sufficient pam_winbind.so use_first_pass auth required pam_deny.so account required pam_unix.so broken_shadow account sufficient pam_succeed_if.so uid < 500 quiet account [default=bad success=ok user_unknown=ignore] pam_winbind.so account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok password sufficient pam_winbind.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so session required pam_mkhomedir.so skel=/etc/skel umask=0022 アクセス時に/home下にディレクトリが存在しない場合に自動で作成する設定 |
上記のkrb.conf / smb.conf / nsswitch.conf / system-authは次のコマンドで対話形式に設定を行う事も可能です。ただし、細かい部分まで設定できませんの直接編集する必要性はあります。
最後にKerberos認証に必要なチケットを取得するためにkinitを実行します。チケットの発行はDCで行われるためkinitの引数にWindowsサーバのドメイン管理者を指定します。
# kinit administrator # klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: administrator@AD-DOMAIN.LOCAL Valid starting Expires Service principal 11/05/11 16:29:00 11/06/11 02:29:15 krbtgt/AD-DOMAIN.LOCAL@AD-DOMAIN.LOCAL renew until 11/06/11 16:29:00 11/05/11 16:29:40 11/06/11 02:29:15 test$@AD-DOMAIN.LOCAL renew until 11/06/11 16:29:00 Kerberos 4 ticket cache: /tmp/tkt0 klist: You have no tickets cached |
チケットの取得に成功したらnetでADドメインに参加します。ADドメインに参加するときは利用するプロトコルとしてadsを指定します。
# net ads join -U administrator administrator's password: Using short domain name -- AD-DOMAIN Joined 'CENTOS2' to realm 'AD-DOMAIN.LOCAL' |
以下のコマンドでwinbindを起動し、ユーザ情報の取得等を行なってみます。
# /etc/rc.d/init.d/winbind start # wbinfo -u AD-DOMAIN+administrator AD-DOMAIN+guest AD-DOMAIN+support_388945a0 AD-DOMAIN+krbtgt AD-DOMAIN+test # wbinfo -g AD-DOMAIN+helpservicesgroup AD-DOMAIN+telnetclients AD-DOMAIN+domain computers AD-DOMAIN+domain controllers AD-DOMAIN+schema admins AD-DOMAIN+enterprise admins AD-DOMAIN+cert publishers AD-DOMAIN+domain admins AD-DOMAIN+domain users AD-DOMAIN+domain guests AD-DOMAIN+group policy creator owners AD-DOMAIN+ras and ias servers AD-DOMAIN+dnsadmins AD-DOMAIN+dnsupdateproxy AD-DOMAIN+passwordpropdeny AD-DOMAIN+unixgroup |
またNSSの機能も含めてwinbindの動作を確認するにはgetentなどのコマンドを利用します。getentはシステムで利用可能なユーザ一覧をライブラリ経由で取得し端末上に表示します。ユーザ情報を取得するためにはpasswdオプションを指定します。またグループ情報を取得する場合にはgroupオプションを使用します。
# getent passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin news:x:9:13:news:/etc/news: uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin nscd:x:28:28:NSCD Daemon:/:/sbin/nologin vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin pcap:x:77:77::/var/arpwatch:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin haldaemon:x:68:68:HAL daemon:/:/sbin/nologin avahi:x:70:70:Avahi daemon:/:/sbin/nologin avahi-autoipd:x:100:101:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin user1:x:500:500::/home/user1:/bin/bash AD-DOMAIN+administrator:*:30000:30000:Administrator:/home/administrator:/bin/bash AD-DOMAIN+guest:*:30001:30001:Guest:/home/guest:/bin/bash AD-DOMAIN+support_388945a0:*:30002:30000:SUPPORT_388945a0:/home/support_388945a0:/bin/bash AD-DOMAIN+krbtgt:*:30003:30000:krbtgt:/home/krbtgt:/bin/bash AD-DOMAIN+test:*:30005:30000:test test:/home/test:/bin/bash # getent group root:x:0:root bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon sys:x:3:root,bin,adm adm:x:4:root,adm,daemon tty:x:5: disk:x:6:root lp:x:7:daemon,lp mem:x:8: kmem:x:9: wheel:x:10:root mail:x:12:mail news:x:13:news uucp:x:14:uucp man:x:15: games:x:20: gopher:x:30: dip:x:40: ftp:x:50: lock:x:54: nobody:x:99: users:x:100: utmp:x:22: rpc:x:32: mailnull:x:47: smmsp:x:51: nscd:x:28: floppy:x:19: vcsa:x:69: sshd:x:74: rpcuser:x:29: nfsnobody:x:65534: pcap:x:77: utempter:x:35: slocate:x:21: ntp:x:38: dbus:x:81: haldaemon:x:68: avahi:x:70: avahi-autoipd:x:101: apache:x:48: xfs:x:43: sabayon:x:86: stapdev:x:102: stapusr:x:103: screen:x:84: oprofile:x:16: audio:x:63: ecryptfs:x:104: stap-server:x:155: user1:x:500: AD-DOMAIN+helpservicesgroup:*:30002:AD-DOMAIN+support_388945a0 AD-DOMAIN+telnetclients:*:30003: AD-DOMAIN+domain computers:*:30004: AD-DOMAIN+domain controllers:*:30005: AD-DOMAIN+schema admins:*:30006:AD-DOMAIN+administrator AD-DOMAIN+enterprise admins:*:30007:AD-DOMAIN+administrator AD-DOMAIN+cert publishers:*:30008: AD-DOMAIN+domain admins:*:30009:AD-DOMAIN+administrator AD-DOMAIN+domain users:*:30000: AD-DOMAIN+domain guests:*:30001: AD-DOMAIN+group policy creator owners:*:30010:AD-DOMAIN+administrator AD-DOMAIN+ras and ias servers:*:30011: AD-DOMAIN+dnsadmins:*:30012: AD-DOMAIN+dnsupdateproxy:*:30013: AD-DOMAIN+passwordpropdeny:*:30014:AD-DOMAIN+administrator AD-DOMAIN+unixgroup:*:30015:AD-DOMAIN |