らくがきちょう

なんとなく

鍵交換方式を使って SSH ログイン出来るように OpenLDAP を設定する

CentOS7 に OpenSSH をインストールし、SSH 公開鍵を用いてログイン出来るようにする手順をメモしておきます。 クライアント側では nscd は利用せず、sssd を利用します。

テスト環境

今回のテスト環境は以下の通りです。

サーバ

クライアント

パラメータ

インストールするパラメータは以下とします。 自身の環境に併せて適宜、修正します。

項目
ベースとなる DN dc=example,dc=com
管理ユーザ cn=Manager,dc=example,dc=com
ユーザ格納用の OU ou=Users,dc=example,dc=com
グループ格納用の OU ou=Groups,dc=example,dc=com
LDAP サーバのアドレス 192.168.1.1

OpenLDAP サーバ側の設定

まず、OpenLDAP サーバ側を構築します。

パッケージのインストール

OpenLDAP 関連のパッケージは標準リポジトリから yum でインストールします。 OpenLDAPSSH を連携させる為に openssh-ldap もインストールしておきます。

yum -y install openldap-clients openldap-servers openssh-ldap

ゼロから設定する為、デフォルトで存在している .ldif ファイルは削除しておきます。

rm /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif

サービスを起動します。 併せて自動起動設定もしておきます。

systemctl start slapd
systemctl enable slapd

ドメインの基本設定

ベース DN や各種の OU、管理用ユーザを作成します。 管理用ユーザのパスワードは slappasswd で作成しておきます。

# slappasswd
New password:
Re-enter new password:
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

設定変更用の .ldif ファイルを用意します。 今回は create-domain.ldif というファイル名にしました。 userPassword には slappasswd で生成した値を指定します。

dn: olcDatabase=hdb,cn=config
objectClass: olcHdbConfig
olcDatabase: hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=example,dc=com
olcRootDN: cn=Manager,dc=example,dc=com
olcAccess: to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by * none
olcAccess: to dn.subtree="" by * read

dn: dc=example,dc=com
dc: example
o: example.com
objectClass: dcObject
objectClass: organization

dn: ou=Users,dc=example,dc=com
ou: Users
objectClass: organizationalUnit

dn: ou=Groups,dc=example,dc=com
ou: Groups
objectClass: organizationalUnit

dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: Manager
userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

ldapadd で設定を反映します。

ldapadd -H ldapi:/// -f create-domain.ldif

ACL の設定

ACL を設定します。 以下の内容を acl.ldif というファイル名で新規作成しておきます。

dn: olcDatabase={2}hdb,cn=config
replace: olcAccess
olcAccess: to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by * break
olcAccess: to attrs=userPassword by anonymous auth by * none
olcAccess: to * by * read

ldapmodify で設定を反映します。

ldapmodify -Y EXTERNAL -H ldapi:/// -f acl.ldif

スキーマの登録

代表的なスキーマを登録しておきます。

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif

OpenSSH 連携の設定

OpenSSH と OpenLDAP を連携させる為の設定を実施します。 以下の内容で openssh-ldap.ldif というファイルを新規作成します。

dn: cn=openssh-lpk-openldap,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk-openldap
olcAttributeTypes: ( 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 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' DESC 'MANDATORY: OpenSSH LPK objectclass' SUP top AUXILIARY MUST ( sshPublicKey $ uid ) )

ldapadd で設定を反映します。

ldapadd -Y EXTERNAL -H ldapi:/// -f openssh-ldap.ldif

クライアントの設定

次はクライアント側の設定を行います。

パッケージのインストール

まず、必要なパッケージをインストールします。

yum -y install oddjob-mkhomedir openldap-clients sssd sssd-client sssd-ldap

sssd の設定

sssd はインストールしても設定ファイルが作成されません。 そこで、sssd 用の設定ファイルを /etc/sssd/sssd.conf に以下の内容で作成します。

[sssd]

debug_level         = 0
config_file_version = 2
services            = nss, pam, ssh, sudo
domains             = default

[domain/default]

id_provider     = ldap
auth_provider   = ldap
chpass_provider = ldap
sudo_provider   = ldap

ldap_uri              = ldap://192.168.1.1
ldap_search_base      = dc=example,dc=com
ldap_id_use_start_tls = False

ldap_search_timeout              = 3
ldap_network_timeout             = 3
ldap_opt_timeout                 = 3
ldap_enumeration_search_timeout  = 60
ldap_enumeration_refresh_timeout = 300
ldap_connection_expire_timeout   = 600

ldap_sudo_smart_refresh_interval = 600
ldap_sudo_full_refresh_interval  = 10800

entry_cache_timeout = 1200
cache_credentials   = True

[nss]

homedir_substring = /home

entry_negative_timeout        = 20
entry_cache_nowait_percentage = 50

[pam]

[sudo]

[autofs]

[ssh]

[pac]

[ifp]

/etc/sssd/sssd.conf の権限と所有者を修正しておきます。

chmod 600 /etc/sssd/sssd.conf
chown root:root /etc/sssd/sssd.conf

ここまでの設定が完了したら sssd を起動します。 併せて自動起動の設定も実施しておきます。

systemctl start sssd.service
systemctl enable sssd.service

認証関連パラメータの更新

authconfig で認証関連のパラメータを更新しておきます。 ユーザがログインした際にホームディレクトリも作成出来るよう、--enablemkhomedir オプションも指定しておきます。

authconfig \
  --disableldap \
  --disableldapauth \
  --disableldaptls \
  --enablelocauthorize \
  --enablemkhomedir \
  --enablesssd \
  --enablesssdauth \
  --update

sshd の設定修正

OpenLDAP と OpenSSH が連携出来るよう、sshd の設定ファイルである /etc/ssh/sshd_config を修正します。 デフォルトでは AuthorizedKeysCommandAuthorizedKeysCommandUser 設定がコメントアウトされているのですが、これを以下のように修正します。

AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
AuthorizedKeysCommandUser root

ここまでの設定が完了したら sshd と sssd を再起動しておきます。

systemctl restart sshd.service
systemctl restart sssd.service

ログイン確認

OpenLDAP サーバ側に SSH 公開鍵を登録したユーザを作成し、秘密鍵を指定してクライアントへログインできれば OK です。

サーバのログ確認

上手くいかない場合は OpenLDAP サーバ側のログを確認します。 CentOS7 は systemd ベースなので journalctl でログを確認出来ます。

journalctl -u slapd

リアルタイムでログを確認するには -f オプションも付与します。

journalctl -u slapd -f