鍵交換方式を使って SSH ログイン出来るように OpenLDAP を設定する
CentOS7 に OpenSSH をインストールし、SSH 公開鍵を用いてログイン出来るようにする手順をメモしておきます。 クライアント側では nscd は利用せず、sssd を利用します。
テスト環境
今回のテスト環境は以下の通りです。
サーバ
- CentOS Linux release 7.4.1708 (Core)
- openldap-clients-2.4.44-5.el7.x86_64
- openldap-2.4.44-5.el7.x86_64
- openldap-servers-2.4.44-5.el7.x86_64
クライアント
- CentOS Linux release 7.4.1708 (Core)
- openldap-2.4.44-5.el7.x86_64
- openldap-clients-2.4.44-5.el7.x86_64
パラメータ
インストールするパラメータは以下とします。 自身の環境に併せて適宜、修正します。
項目 |
値 |
ベースとなる 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 でインストールします。 OpenLDAP と SSH を連携させる為に 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
で生成した値を指定します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | 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
に以下の内容で作成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 | [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
を修正します。 デフォルトでは AuthorizedKeysCommand
と AuthorizedKeysCommandUser
設定がコメントアウトされているのですが、これを以下のように修正します。
| 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
でログを確認出来ます。
リアルタイムでログを確認するには -f
オプションも付与します。