とあるエンジニアの備忘log
2012年12月19日水曜日
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 に変更する必要があります。
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿