Kerberos を使ってみる (RHEL/CentOS/Ubuntu編)
NFSv4 と Kerberos を組み合わせて、 NFS のセキュリティの弱さをカバーしてみたいと思います。
長いので 2回に分けました。
今回は Kerberos の初期設定の部分までやってみます。
まずは RHEL/CentOS の場合のやり方を説明し、最後に Ubuntu でやる場合の差分情報をまとめておきます。
RHEL/CentOS編
RHEL 6.3/CentOS 6.3で確認しました。
Kerberos サーバー側は krb5-server
パッケージをインストールします。
クライアント側については krb5-workstation
がデフォルトでインストールされているので、特にインストールする必要はないです。
Kerberos サーバーのことを KDC (Key Distribution Center) と言います。
主に設定変更するファイルは3点です。
/etc/krb5.conf
: Kerberos 認証を利用する全ホストで設定必要/var/kerberos/krb5kdc/kdc.conf
: KDCのみ設定する/var/kerberos/krb5kdc/kadm5.acl
: KDCのみ設定する
以下、説明の都合上、
- KDCのホスト名 :
mykdc.mydomain.com
- サービスサーバーのホスト名:
myserver.mydomain.com
- サービスクライアントのホスト名:
myclient.mydomain.com
として説明します。
mykdc
と myserver
は同一ホストであってもいいですが、一応、別々として説明しています。
Kerberos のシングルサインオンで、 myclient
から myserver
へ ssh ログインするところまでやってみます。
krb5.conf の修正
各ホストの /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 = EXAMPLE.COM ←コメントアウト
default_realm = MYDOMAIN.COM ←追加
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
EXAMPLE.COM = {
kdc = kerberos.example.com
admin_server = kerberos.example.com
}
MYDOMAIN.COM = { ←追加
kdc = mykdc.mydomain.com ←追加
admin_server = mykdc.mydomain.com ←追加
} ←追加
[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
レルム名 (Kerberos が管理する範囲のこと) が EXAMPLE.COM
になっているので、 MYDOMAIN.COM
に変更しました。
ドメイン名を大文字にしたものをレルム名にするのが慣例です。
kdc.conf の修正
KDCホストの /var/kerberos/krb5kdc/kdc.conf
を以下のように修正。
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
# EXAMPLE.COM = { ← コメントアウト
MYDOMAIN.COM = { ← 追加
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
kadm5.acl の修正
KDCホストの /var/kerberos/krb5kdc/kadm5.acl
を以下のように修正。
# */admin@EXAMPLE.COM * ← コメントアウト
*/admin@MYDOMAIN.COM * ← 追加
これは kadmin
中で実行可能なコマンドを設定しています。
*/admin
のユーザーに全コマンドを許可するのが慣習です。
データベース設定
3種類のファイルの修正ができたら KDC上で
root@mykdc # kdb5_util create -s
でデータベースを作成する。
途中で KDC database master key を入力するように言われるので、パスワードを設定します。
さらにサーバー側で kadmin.local
で root/admin
プリンシパルを作成する。
kadmin.local
はどんなコマンドでもパーミッションを無視して、成功します。
root@mykdc # kadmin.local
...
kadmin.local: addprinc root/admin
...
kadmin.local: exit
kadmin サービスと krb5kdc サービスを開始する。
root@mykdc # chkconfig kadmin on
root@mykdc # service kadmin start
root@mykdc # chkconfig krb5kdc on
root@mykdc # service krb5kdc start
ファイアウォールを設定している場合、
88/tcp, 88/udp
(krb5kdc サービス)749/tcp
(kadminサービス)
を開けておきます。
これ以降は、どのホストからでも
$ kadmin -p root/admin
とすれば、KDC database のメンテができるようになります。
どのホストからでもいいのですが、以下のようにユーザープリンシパルやホストプリンシパルを作ります。
$ kadmin -p root/admin
kadmin: addprinc user01
kadmin: addprinc -randkey host/myserver.mydomain.com
kadmin: exit
とします。 user01
は使うユーザー名で適宜置き換えてください。
最後、ホストプリンシパルのパスワードを ktadd
する。これは必ずサービスサーバー上で行わないといけない。
root@myserver # kadmin -p root/admin
kadmin: ktadd host/myserver.mydomain.com
kadmin: exit
キーはサービスサーバーの /etc/krb5keytab
へ保存されます。
試しに、以下のようにするとキーが保存されているのがわかります。
myserver # klist -e -k /etc/krb5.keytab
Keytab name: WRFILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
2 host/myserver.mydomain.com@MYDOMAIN.COM (aes256-cts-hmac-sha1-96)
2 host/myserver.mydomain.com@MYDOMAIN.COM (aes128-cts-hmac-sha1-96)
2 host/myserver.mydomain.com@MYDOMAIN.COM (des3-cbc-sha1)
2 host/myserver.mydomain.com@MYDOMAIN.COM (arcfour-hmac)
2 host/myserver.mydomain.com@MYDOMAIN.COM (des-hmac-sha1)
2 host/myserver.mydomain.com@MYDOMAIN.COM (des-cbc-md5)
以上でセットアップ完了です。
クライアント側で
user01@myclient $ kinit
で認証します。
user01@myclient $ ssh myserver
で myserver
のログインパスワードを入力せずに、ssh 接続できます。
Kerberos で認証できているためです。シングルサインオンが実現しました!
user01@myclient $ klist
でキャッシュされているチケットが表示されます。
Valid starting Expires Service principal
12/17/12 16:26:33 12/18/12 16:26:33 krbtgt/MYDOMAIN.COM@MYDOMAIN.COM
renew until 12/17/12 16:26:33
12/17/12 16:27:17 12/18/12 16:26:33 host/myserver.mydomain.com@MYDOMAIN.COM
renew until 12/17/12 16:26:33
なお、 ホストプリンシパルのサービスチケットの取得がうまく行かない場合、 /etc/hosts
を確認してみてください。
192.168.10.xx myserver.mydomain.com myserver
のように Fully Qualified Domain Name が先にくるように書いておかないと、ホストの逆引きで失敗します。
192.168.10.xx myserver myserver.mydomain.com
のように書くとうまくいきません。
Ubuntu編
Ubuntu 12.04 LTS で確認しました。
KDC側は
$ sudo apt-get install krb5-kdc krb5-admin-server
KDC以外のホストは
$ sudo apt-get install krb5-user
をインストールします。
インストールの途中で
- レルム
- あなたのレルムのケルベロスサーバー (
/etc/krb5.conf
のkdc
に設定される) - あなたのレルムのケルベロス管理サーバー (
/etc/krb5.conf
のadmin_server
に設定される)
を質問されるので、答えます。
これに基づき、/etc/krb5.conf
と /etc/krb5kdc/kdc.conf
(KDCのみ)を作ってくれるので、とりあえずそのまま使えます。
ちなみに、RHEL/Ubuntu で /var/kerberos/krb5kdc/
にあったディレクトリは Ubuntu では /etc/krb5kdc/
にあります。
mykdc $ sudo krb5_newrealm
でデータベースを作成する。この時に /etc/krb5kdc/kadmin.acl
も作成されます。
/etc/krb5kdc/kadmin.acl
の
# */admin *
のコメントを外す。
あとは
mykdc $ sudo kadmin.local
kadmin.local: addprinc user01/admin
などとし、RHEL/CentOS と同様にプリンシパルを追加していきます。
なお、Kerberos による ssh シングルサインオンをするには
ssh サーバー側の /etc/ssh/sshd_config
の
GSSAPIAuthentication no
を
GSSAPIAuthentication yes
に変更する必要があります。
blog comments powered by Disqus