社内のユーザーアカウントを Windows ActiveDirectoryで管理していて、
イントラの Webサーバーとかバージョン管理のサーバー等に
部分的に Linuxを導入しているところは多いと思います。
弊社でも Linuxを野放しにしていたため、
パスワードが各サーバーでパスワードが違って、面倒なことになって来ました。
遅ればせながら、今回は Kerberosを使って、パスワードの管理を
Windowsドメイン ActiveDirectory側にまとめてみましたので、設定の仕方を記録しておきます。
対象としたのは、Debian(etch)ですが、
他のディストリビューションでも設定にはかわりはないと思います。
まず、設定に必要なパッケージをインストールします。
pam-krb5 インストール途中で入力が要求されるものは、DCの名前です。適当に答えておきます。
ただし、ドメイン名は大文字で書かなくてはいけませんので注意します。
インストールが終了したら Kerberos クライアントが使用する設定ファイルを確認しておきます。
# vi /etc/krb5.conf(確認が必要な個所だけ抜粋)
default_realm = HOGEHOGE.CO.JP (大文字であることを確認)
[realms]
HOGEHOGE.CO.JP = {
kdc = dc1.HOGEHOGE.CO.JP
kdc = dc2.HOGEHOGE.CO.JP (dcが複数あれば行を追記しても可)
admin_server = yamahiko.HOGEHOGE.CO.JP
}
[domain_realm] (必要に応じて追記。使い方によっては不要?)
.hogehoge.co.jp = HOGEHOGE.CO.JP
hogehoge.co.jp = HOGEHOGE.CO.JP
うまく設定できたか、Kerberosクライアント側のコマンドを使って確認します。
Password for ichikawa@HOGEHOGE.CO.JP:(Windowsドメインのパスワードを入力する)
うまく認証できれば何のメッセージもなくプロンプトに戻りますが
エラーの場合は以下のようになります。
kinit(v5): Cannot resolve network address for KDC in requested realm while getting initial credentials
(ドメインが存在しない)
# kinit hogehoge@HOGEHOGE.CO.JP
kinit(v5): Client not found in Kerberos database while getting initial credentials
(ユーザーが存在しない)
# kinit ichikawa@hogehoge.co.jp
Password for ichikawa@hogehoge.co.jp:(Windowsドメインのパスワードを入力する)
kinit(v5): KDC reply did not match expectations while getting initial credentials
(ドメインが小文字)
# kinit ichikawa@HOGEHOGE.CO.JP
Password for ichikawa@HOGEHOGE.CO.JP:(Windowsドメインのパスワードを入力する)
kinit(v5): Preauthentication failed while getting initial credentials
(パスワードを間違えた)
# kinit ichikawa@HOGEHOGE.CO.JP
Password for ichikawa@HOGEHOGE.CO.JP:(Windowsドメインのパスワードを入力する)
kinit(v5): Clock skew too great while getting initial credentials
(Linuxと ActiveDirectoryの DCの時刻が 5分以上ずれている)
いくつかの例では、Windowsの DC側のセキュリティログにイベントが残り、
Windows側にパスワードの間違いでロックがかかるようなグループポリシーを設定している場合は、
Linux側のパスワード間違いも対象になるはずです。
さて、Kerberosの設定が正しいことを確認したら、次はログイン等の認証方法を設定している pam関係のファイルを修正します。
/etc/pam.d/login等の特定のコマンド用のファイルを直すよりは、
それらが includeで使用している共通の common-** のファイルを修正します。
# vi /etc/pam.d/common-auth
#auth required pam_unix.so nullok_secure (下行と置き換え)
auth required pam_unix2.so (追加。 pam_unix.so をそのまま利用していると、passwordを 2回聞いてきたりするので)
# vi /etc/pam.d/common-session
session required pam_unix.so (pam_unix2.soでなくても良い???)
session required pam_mkhomedir.so skel=/etc/skel umask=0022 (追加)
(ついでなので、ログインしたら自動でホームディレクトリが作成されるようにする)
以上です。何かのプロセスを再起動したりする必要はありません。
ついでに Windowsドメインと同じ名前ですでに Linux側にパスワードを持ったアカウントがあれば、
/etc/shadow を編集したりしてLinux側のパスワードを消去しておきます。
パスワードを保持したままだと Windowsドメインのパスワード/Linuxのパスワードどちらでもログインできてしまいます。
以降の運用は
アカウント追加時
1.Windows側でアカウントを作成。
2.Linux側でアカウントを作成。
useradd newUser (←これだけで可)
アカウント無効時
1.Windows側でアカウントを無効化。
2.(Linux側でもログインできなくなる)
これで複数のパスワードを覚えておく必要はなく、Windowsドメインのパスワードを修正するだけで Linuxへのログインパスワードも変わります。
Linux側でユーザーを管理するための UIDや GIDを付番するために、
アカウント自体は Linux側にも作成する必要があるものの、パスワードの管理は Windows側に集約できます。
Linuxへのログインが一切必要ないアカウントは作成しなくてよく、
またLinuxにしかログインしないアカウントは従来通り Linux側にだけ作成することができます。
さらにアカウントまで Windowsドメイン側に統合したければ Winbindや LDAPを使ったりすることになるようですが、それはまた別の機会に。