19 December 2012

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

として説明します。

mykdcmyserver は同一ホストであってもいいですが、一応、別々として説明しています。

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.localroot/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.confkdc に設定される)
  • あなたのレルムのケルベロス管理サーバー (/etc/krb5.confadmin_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