やりたいこと
CentOSのUNIXアカウントに、ActiveDirectory上のアカウント情報でログインしたい。早い話が、UNIXアカウントとActiveDirectoryのアカウントを統合したい。
方法
ActiveDirectoryをCentOS側からバインドして、その中の情報をもとにLDAP認証を行うようにする。
準備するもの
- CentOS7系のサーバ
- ActiveDirectoryサーバ
- WindowsServer2012推奨
- 合わせてDNSも設定済であること
手順
1. CentOS7系サーバ (以下Linux) に必要なミドルウェアを入れる
こちらは全てyumでインストール可能です。一部依存性で他のものも入れる必要はあるかもしれませんが、全てyumであれば一括でインストール可能です。
yum install openldap-clients nss-pam-ldapd
2. LinuxからActiveDirectoryサーバ (以下ADS) への通信ができるよう設定する
具体的には、以下の設定を行います。
- 非常時に内向きDNSを経由しなくともADへのFQDN (またはドメイン名) でのアクセスができるようhostsに追記する
- 内向きDNSをリゾルバに追記する
- 必ず最上位に設定してください
- 既存のリゾルバは消さないでください
- EC2等リゾルバを起動時に自動設定する環境の場合は、上書きされないようPEERDNSを切ってください
3. authconfig-tuiコマンドでADS等を設定する
pam.d等を一斉変更する便利なコマンド、それがauthconfigコマンドです。
これには2種類あり、本当の1行コマンド用のauthconfigコマンドのほか、半GUI (TUI) で設定の可能なauthconfig-tuiコマンドもあります。僕は通常こちらを使って設定します。
authconfig-tui
と打ってEnterを押すだけで、青い見慣れぬ画面が出てくると思います。この時言語設定が日本語になっているなら、おそらく日本語のTUIが出てくると思います(最も、英語版でも大体見たことあるような単語ばかりなので対応可能だと思います)。
環境により設定しなければならない項目はもちろん変わりますが、最低限設定の必要な項目は以下の通りです。
- 「認証の設定」
- ユーザ情報
- 『LDAPを使用』→チェック追加
- 認証
- 『MD5パスワードを使用』→チェック追加
- 『シャドウパスワードを使用』→チェック追加
- 『LDAP認証を使用』→チェック追加
- ユーザ情報
- 「LDAP設定」
- TLSを使用→環境に応じてチェック追加
- サーバー→環境に応じて追記
- ldap://XXX.XXX.XXX.XXX/ というフォーマット必要に応じて追加
- 複数台分散をしている場合はスペース区切りで複数台追加可能
- ベースDN→環境に応じて追記
4. nslcd設定変更
vimか何かで、Linuxの/etc/nslcd.confを編集し、ActiveDirectoryのディレクトリとLDAPクライアント (nslcd) の要素を明示的にマッピングします。
おそらく /etc/nslcd.conf を開くと下の方にコメントアウトしてLDAPDであったり各世代のADであったり、いくつかのパターンのマッピングサンプルがコメントアウトされた状態で記述されています。環境にもよりますが、それをいくつかコメントアウトするだけで普通に動作可能です。
ちなみに僕の環境では以下のようにコメントアウト及び追記をしています。
# Mappings for Active Directory
pagesize 1000
referrals off
idle_timelimit 800
filter passwd (&(objectClass=user)(!(objectClass=computer))(uidNumber=*)(unixHomeDirectory=*))
map passwd uid sAMAccountName
map passwd homeDirectory unixHomeDirectory
map passwd gecos displayName
filter shadow (&(objectClass=user)(!(objectClass=computer))(uidNumber=*)(unixHomeDirectory=*))
map shadow uid sAMAccountName
map shadow shadowLastChange pwdLastSet
filter group (objectClass=group)
大体sAMAccountName(Windowsでのログイン名)をUNIXログイン名とすると仕様上ちょうど良さそうですが、例えばADS側の運用次第ではdisplayNameやnameをuidにマッピングすることも可能です。本質的に『統合』するならそれが完全かなという気もします。
というわけで、これでだいたい動くと思います。ADSもLinuxも基本的に再起動はいらないはずです。
Tips
動作検証方法
セットアップが終わった時点でLDAPが正常に動作しているか見たい!
[1] getentコマンドでアカウント情報を引けるか確認する
一番メジャーなパターンです。
getent passwd
でローカルアカウントだけでなくADS上のアカウントまで呼び出せていれば、アカウント情報が引けています。
getent passwd {AD_USER_NAME}
でAD_USER_NAMEの情報を絞り込んで引くこともできます。
いずれでも情報が全く引けない場合は、 /var/log/messages または /var/log/secure にLDAP系のなにがしかのエラーが出ているか、そもそもなんにも出ていないかで問題を切り分け、前者であればそのエラーに応じて対応を、後者であればそもそもnslcdが動いていないのでLinux側の設定見直しを進める必要があります。
[2] 実際にログインできるか確認する
割とこれは確かな検証方法なので、[1]と組み合わせて必ず行っています。
普通にUNIXログインをするだけですので、方法は省略します。
[1]だけでは発覚し得ない問題としては、pam.dの設定ミス等が上げられます。もしsshdやpamでの問題が発生していたとしても[1]ではいずれも通らないため、問題が発生しません。なので、[1]で『やったー通った!』と思ってログアウトしてあとでログインをしようとした時に誰もログインできなくなっていた・・・というケースも十分想定されます。
なお、もちろんのことですが、この検証を行う場合は、必ず別枠でrootまたはその他sudo可能なローカルアカウントにてログインした状態を確保しておきましょう。
sudo設定
sudoer設定は可能です。ユーザ名でもグループでも、UNIXローカルアカウントを設定していた時と同じ感覚で設定できます。
グループ設定
グループもADSに保存し、同期することができます。そのグループごとにsudoer設定やその他権限設定をすることももちろん可能です。
ただし、権限設定は原則として各Linux側で行うことしかできません。属性を増やしてそれをトリガーにsudoerに追加することもできますが、いずれにしてもLinux側でそれをトリガーにするという設定が必要となるため、権限設定をする上でLinux側での設定はどういう形であれ必須となります。
CentOS7以外でもADSとアカウント統合ができるのか?
OpenLDAPのクライアントが使えるなら、だいたいどのUNIX系OSでもイケルと思います。
僕の方でもざっと CentOS5~7・FreeBSD9~11・AmazonLinuxで動作を確認済みです。
ADSとの統合の種類
すぐ実現可能なお手軽なものとしては、大きく分けると3種類あるのは確認しています。
- OpenLDAPを使ったLDAP認証によるもの
- RHEL系Linuxだと主流?
- Sambaを使ったWinbind認証によるもの
- FreeBSDだと主流?
- ActiveDirectoryクライアントを用いたもの
- Windows Ubuntu Subsystem
- MacOSX
一番上のが今回まとめたパターンで、多分最もお手軽です。RHEL系Linuxで設定している方が公開している情報はこのパターンだけだったかもしれません。FreeBSD等他のUNIX系OSでもだいたい実装可能ですが、バージョンとディストリビューションで少なからず実装方法が異なるので注意が必要です。CentOSですら、5と6と7で大きく異なっていました。
真ん中のが意外と熱い、Winbind認証というActiveDirectoryに直接認証を統合するパターンです。一番上はADSに対してLDAPという互換性のある別プロトコルでアクセスするものですが、こちらはそうではありません。Sambaを導入しなければいけなかったり設定が複雑だったりで少し初期投資が必要になるものの、落ちている情報が多くしかもその多くが程よく枯れているので、きっちり腰を据えて設定したい場合はこれがおすすめです。デスクトップ環境へのログイン・ファイルサーバへのログイン・UNIXログインを全てWinbindで統一して設定すると楽になるかもしれません。
一番下はWindows10搭載のサブシステムやMacOSX限定です。OS内にActiveDirectoryクライアントがある場合のみの話になりますので、割愛します。