sshでケルベロス認証を使う
Secure Shell(ssh)の認証を ケルベロス認証(kerberos)を用いることができます。Ubuntu の環境にケルベロス認証の環境を構築しました。同様に CentOS などの環境でも同じことができます。
読み方
- kerberos
- けるべろす
目次
概要
GSS-API(Generic Security Standard Application Programming Interface)は、ケルベロスなどの複数の認証方式にたいして、統一のAPIを提供します。多くのアプリケーションは、GSS-APIを利用して、ケルベロス認証を利用してます。 OpenSSHは、GSS-APIに対応しています。
通常は、3台用意してやるのが良いのでしょうが、ここでは、2台でやっている例になります。
対象OS
ここでは、Ubuntuを利用しています。
サーバ環境構築
ここでは、u2.local というのがサーバにあたります。 レルムは、LOCAL とします。
インストール
sudo apt install krb5-kdc krb5-admin-server
インストール中に /etc/krb5.conf 用の設定を3つほど、確認されます。
- レルム
- ケルベロスサーバ (kdc) のサーバ
- 管理用サーバ
┌────────┤ Configuring Kerberos Authentication ├─────────┐ │ When users attempt to use Kerberos and specify a principal or user name │ │ without specifying what administrative Kerberos realm that principal │ │ belongs to, the system appends the default realm. The default realm may │ │ also be used as the realm of a Kerberos service running on the local │ │ machine. Often, the default realm is the uppercase version of the local │ │ DNS domain. │ │ │ │ Default Kerberos version 5 realm: │ │ │ │ _________________________________________________________________________ │ │ │ │ <Ok> │ ┌─────────┤ ケルベロス認証を設定します ├─────────────┐ │ 利用者がケルベロスを利用しようとするとき、プリンシパルやユーザ名の属する │ │ ケルベロスの管理レルムを指定せずに使うと、そこにデフォルトのレルムが加え │ │ られます。デフォルトのレルムはローカルなマシン上のケルベロスサービスのレ │ │ ルムとしても使われるでしょう。多くの場合、デフォルトのレルムはローカルな │ │ DNS ドメインを大文字にしたものです。 │ │ │ │ デフォルトのケルベロスバージョン 5 レルム: │ │ │ │ _________________________________________________________________________ │ │ │ │ <了解> │ │ │ └──────────────────────────────────────┘
krb5_newrealm
$ sudo krb5_newrealm This script should be run on the master KDC/admin server to initialize a Kerberos realm. It will ask you to type in a master key password. This password will be used to generate a key that is stored in /etc/krb5kdc/stash. You should try to remember this password, but it is much more important that it be a strong password than that it be remembered. However, if you lose the password and /etc/krb5kdc/stash, you cannot decrypt your Kerberos database. Loading random data Initializing database '/var/lib/krb5kdc/principal' for realm 'LOCAL', master key name 'K/M@LOCAL' You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter KDC database master key: Re-enter KDC database master key to verify: Now that your realm is set up you may wish to create an administrative principal using the addprinc subcommand of the kadmin.local program. Then, this principal can be added to /etc/krb5kdc/kadm5.acl so that you can use the kadmin program on other computers. Kerberos admin principals usually belong to a single user and end in /admin. For example, if jruser is a Kerberos administrator, then in addition to the normal jruser principal, a jruser/admin principal should be created. Don't forget to set up DNS information so your clients can find your KDC and admin servers. Doing so is documented in the administration guide.
kadm5.acl
sudo vim /etc/krb5kdc/kadm5.acl
kadm5.acl の
# */admin *
の # を外します。
kadmin.local
sudo kadmin.local kadmin.local: addprinc root kadmin.local: addprinc root/admin kadmin.local: addprinc user00
実行例
$ sudo kadmin.local Authenticating as principal root/admin@LOCAL with password. kadmin.local: addprinc -randkey host/u2.local WARNING: no policy specified for host/u2.local@LOCAL; defaulting to no policy Principal "host/u2.local@LOCAL" created. kadmin.local: ktadd -k /tmp/u2.local.keytab host/u2.local Entry for principal host/u2.local with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/tmp/u2.local.keytab. Entry for principal host/u2.local with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/tmp/u2.local.keytab. Entry for principal host/u2.local with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/tmp/u2.local.keytab. Entry for principal host/u2.local with kvno 2, encryption type des-cbc-crc added to keytab WRFILE:/tmp/u2.local.keytab. kadmin.local:
keytabファイルの作成
sudo kadmin.local kadmin.local: addprinc -randkey host/u2.local kadmin.local: ktadd -k /tmp/u2.local.keytab host/u2.local
u2.local.keytab を クライアントにコピーして、クライアント:/etc/krb5.keytab に配置します。
設定 sshd
/etc/ssh/sshd_config の設定を変更します。公開鍵認証などをオフにし、ケルベロス認証を有効にします。
PasswordAuthentication yes PubkeyAuthentication no RSAAuthentication no KerberosAuthentication yes KerberosOrLocalPasswd no KerberosTicketCleanup yes # GSSAPI options GSSAPIAuthentication yes GSSAPICleanupCredentials yes UsePAM no
PasswordAuthentication yes でも、パスワードログインは通りません。 KerberosOrLocalPasswd yes にするとパスワードログインも許可されます。
パスワードログイン or ケルベロス認証
- PasswordAuthentication yes
- KerberosOrLocalPasswd yes
ケルベロス認証のみ
- PasswordAuthentication yes
- KerberosOrLocalPasswd no
sshdの設定をリロードさせます。
sudo service ssh reload
テスト
kinit で、ケルベロスのテストをします。 kinit で、ケルベロスサーバからチケットを取得します。
kinit
klist で、チケットを確認できます。
klist
クライアント環境構築
インストール
sudo apt install krb5-user
設定 ssh
/etc/ssh/ssh_config
GSSAPIAuthentication yes GSSAPIDelegateCredentials yes
設定 /etc/krb5.keytab
サーバ側で作成した u2.local.keytab をコピーして、/etc/krb5.keytab に置きます。 scp する前に、パーミッションを変更しておかないと、ファイルにアクセスできません(rootでscpする場合を除き)。
scp サーバ:/tmp/u2.local.keytab . sudo cp u2.local/keytab /etc/krb5.keytab
使い方
こんな感じでログインできます。ssh前に kinit しなくてもsshできる。
u1.local$ ssh user00@u2.local
auth.logの出力は以下の通りです。
Jun 13 23:43:19 u2.local krb5kdc[30564]: AS_REQ (6 etypes {18 17 16 23 25 26}) 10.0.60.132: NEEDED_PREAUTH: user00@LOCAL for krbtgt/LOCAL@LOCAL, Additional pre-authentication required Jun 13 23:43:19 u2.local krb5kdc[30564]: AS_REQ (6 etypes {18 17 16 23 25 26}) 10.0.60.132: ISSUE: authtime 1434206599, etypes {rep=18 tkt=18 ses=18}, user00@LOCAL for krbtgt/LOCAL@LOCAL Jun 13 23:43:19 u2.local sshd[34669]: Accepted password for user00 from 10.0.60.131 port 44972 ssh2
kinit/klist
$ kinit user00 Password for user00@LOCAL: $ klist Ticket cache: FILE:/tmp/krb5cc_1002 Default principal: user00@LOCAL Valid starting Expires Service principal 2015-06-13T23:45:37 2015-06-14T09:45:37 krbtgt/LOCAL@LOCAL renew until 2015-06-14T23:45:33
kdestroy でチケットを削除できます。
チケットがないとき
$ sudo klist klist: Credentials cache file '/tmp/krb5cc_0' not found [5] 32419 exit 1 sudo klist
ユーザが見つからない場合
$ sudo kinit kinit: Client 'root@LOCAL' not found in Kerberos database while getting initial credentials
関連項目
ツイート