URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

「389 Directory Server」でSSHに公開鍵を使って認証する

 以前、389-ds関連の記事を投稿していましたが、最近も少し触っていたのでメモです。

 SSHでログインするときに公開鍵認証を使うことも多いと思いますので、それをLDAPのユーザー情報として格納し、SSHログイン時に利用可能にするまでです。

LDAPサーバの設定

 とりあえず基本的な検証環境は以前の記事を踏襲します。

 SSHで公開鍵認証を使う場合はログイン先の"authorized_keys"ファイルに公開鍵を登録します。この情報をLDAPへ格納する際は"sshPublicKey"属性を使うのですが、389-dsではデフォルトのスキーマでこの属性が存在しないので、カスタムスキーマとして追加することにします。
 以下のLDIFファイルで"sshPublicKey"属性及びそれを含むオブジェクトクラス"ldapPublicKey"を定義します。

dn: cn=schema changetype: modify add: attributetypes attributetypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey' DESC 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE ) - add: objectClasses objectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY DESC 'MANDATORY: OpenSSH LPK objectclass' MAY ( sshPublicKey $ uid ) )

 作成したLDIFを"ldapmodify"で適用します。

# ldapmodify -h localhost -p 389 -D "cn=Directory Manager" -W -f add-sshpubkey.ldif

 この方法で適用したスキーマは"/etc/dirsrv/slapd-<インスタンス名>/schema/99user.ldif"ファイルに保存されるので、このファイルを見て確認することが可能です。

 スキーマを追加したら、ユーザー情報に公開鍵を追加します。
 既にユーザー"test"が作成済みとして、以下のようなLDIFになります。"sshPublicKey"属性に公開鍵をそのまま入力してください。

dn: uid=test,ou=people,dc=example,dc=com changetype: modify add: objectClass objectClass: ldapPublicKey - add: sshPublicKey sshPublicKey: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABg~ (以下省略)

 これを"ldapmodify"で適用すればサーバ側の作業は完了です。

LDAPクライアントの設定

 LDAPに格納した公開鍵を利用してSSHログインするためには、LDAPクライアント側の設定も必要です。
 クライアント側も以前の環境を踏襲し、既にLDAPユーザーでパスワードログインができる状態から始めます。

 まず、LDAPとの認証連携に使っているSSSDで公開鍵を読み取れるようにします。
 設定ファイル"/etc/sssd/sssd.conf"を開いて、下記のように"services"に"ssh"を追加します(変更部分のみ記載)。

[sssd] services = nss, pam, autofs, ssh

 設定を変更してサービス再起動後、"sss_ssh_authorizedkeys"でLDAPから公開鍵が読み取れることを確認します。

# systemctl restart sssd.service
# sss_ssh_authorizedkeys -d default test
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABg~ (以下省略)

 続いて、SSSDで読み取った公開鍵をSSHサービスで受け取るようにします。
 "/etc/ssh/sshd_config"ファイルを直接変更しても良いのですが、最近のRHELのお作法に従って"/etc/ssh/sshd_config.d"配下に対象設定のみ記述したファイルを追加することにします。
 設定が完了したらサービス再起動です。

# cat <<EOF > /etc/ssh/sshd_config.d/99-authkeyscmd.conf
AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
AuthorizedKeysCommandUser nobody
EOF
# systemctl restart sshd.service

 以上でクライアント側の設定も完了です。
 クライアントへSSHの公開鍵認証でログインできることを確認してください。

 こんな所ですかね。