6.OpenLDAPサーバの構築⑥ -LDAPユーザにssh鍵認証設定

投稿者: | 2017年12月8日

5.OpenLDAPサーバの構築⑤ -LDAPユーザの設定までで、ldapサーバとしての機能を活用できるステータスにはなっているが、このままではldapクライアント(sshログインしようとしているユーザが存在するか、ldapサーバへ問い合わせを行う)機能を持ったサーバへsshログインをする際に、useraddコマンドで設定した通常のLinuxユーザと同様にログイン名/パスワードでsshログインをすることになる。

え、それで何が悪いの?

と思われる方がいらっしゃるかもしれないが、セキュリティ向上のためldapユーザに鍵認証設定を行う。ldapユーザに鍵認証を設定するためのオブジェクトを追加することによって、ldapユーザでもssh鍵認証でログインすることができる。しかも通常のLinuxユーザはsshログインするすべてのサーバに公開鍵を置く必要があるが、ldap環境であればldapサーバだけに公開鍵を置けばOK。
具体的な仕組みを説明する。


■オブジェクトクラス「ldapPublicKey」のスキーマ登録

ldapPublicKeyのスキーマは/etc/openldap/schema配下に標準格納されていないため、個別にインストールする必要がある。
以下、yumコマンドでインストール。

[root@ldapserver ~]# yum install openssh-ldap
                :
                :
================================================================================
 Package             アーキテクチャー
                                   バージョン              リポジトリー    容量
================================================================================
インストール中:
 openssh-ldap        x86_64        7.4p1-13.el7_4          updates        111 k

トランザクションの要約
================================================================================
インストール  1 パッケージ

総ダウンロード容量: 111 k
インストール容量: 92 k
Is this ok [y/d/N]: y
Downloading packages:
openssh-ldap-7.4p1-13.el7_4.x86_64.rpm                     | 111 kB   00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : openssh-ldap-7.4p1-13.el7_4.x86_64              1/1
  検証中                  : openssh-ldap-7.4p1-13.el7_4.x86_64              1/1

インストール:
  openssh-ldap.x86_64 0:7.4p1-13.el7_4

完了しました!

OSインストールメディアからインストールする場合は、以下。
1.OpenLDAPサーバの構築① -インストールでOSインストールメディアのマウントとリポジトリファイルを変更したままの場合は①②を省略して③へ。
①OSインストールメディアをマウント

[root@ldapserver ~]# mount /dev/cdrom /media
mount: /dev/sr0 is write-protected, mounting read-only

「mount: /dev/sr0 is write-protected, mounting read-only」と表示されればOk。
※/dev/sr0はディストリビューション(OS)によって異なる。

②リポジトリファイルを編集(1.OpenLDAPサーバの構築① -インストールで変更したままの場合は③へ。)

[root@ldapserver ~]# vi /etc/yum.repos.d/CentOS-Media.repo

<変更前(OSインストール直後の場合)>
[c7-media]
name=CentOS-$releasever – Media
baseurl=file:///media/CentOS/
file:///media/cdrom/
file:///media/cdrecorder/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

<変更後>
[centos-media]
name=centos-media
baseurl=file:///media ―> ①でマウント先に指定した「/media」がここにくる。
gpgcheck=0
enabled=1

③disablerepo,enablerepoオプションを使用してyumコマンドを実行する。

[root@ldapserver ~]# yum –disablerepo=* –enablerepo=centos-media install openssh-ldap

「完了しました!」と表示されればインストールOK。
インストール後、/usr/share/doc/openssh-ldap-7.4p1というディレクトリ配下にopenssh-lpk-openldap.ldifというファイルが追加される。7.4p1というディレクトリ名はディストリビューション(OS)バージョンから来ていて、本環境で使用しているCentOS7.4と同バージョンのPKGということになる。バージョンによってディレクトリ名が変わるということを頭の片隅に置いておこう。

openssh-lpk-openldap.ldifをcatコマンドでのぞくと、以下の内容になっている事が分かる。

[root@ldapserver ~]# cat /usr/share/doc/openssh-ldap-7.4p1/openssh-lpk-openldap.ldif
                :
                :
dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: {0}( 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: {0}( 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 ) )

ldapPublicKeyというオブジェクトクラスと、sshPublicKeyという属性が記述されている。これをldapaddコマンドで追加する。

[root@ldapserver ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/share/doc/openssh-ldap-7.4p1/openssh-lpk-openldap.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=openssh-lpk,cn=schema,cn=config"

ldapaddコマンドのオプションの説明は5.OpenLDAPサーバの構築⑤ -LDAPユーザの設定を参照。
ldapaddコマンドの実行結果で「adding new entry ~」の後にエラーが出なければスキーマ登録OK。
ldapsearchコマンドで、無事にスキーマ登録されたかを確認する。

[root@ldapserver ~]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b 'cn=config' '(objectClass=olcSchemaConfig)'
                :
                :
dn: cn={3}openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: {3}openssh-lpk
olcAttributeTypes: {0}( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey' DES
C 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.
1.1466.115.121.1.40 )
olcObjectClasses: {0}( 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 ) )

ldapsearchコマンドのオプションの説明は5.OpenLDAPサーバの構築⑤ -LDAPユーザの設定を参照。'(objectClass=olcSchemaConfig)’を指定すると、登録されているスキーマがすべて表示される。
sshPublicKeyとldapPublicKeyが表示されればOK。これでスキーマ登録は完了。


■ssh公開鍵/秘密鍵の生成

次はsshログイン用の公開鍵/秘密鍵を作る。方法は複数あるので、一例として広く使われているteratermでの方法と、CentOS7上で作る方法の2パターンを紹介する。

 

・teratermでssh公開鍵/秘密鍵の生成方法

①Windowsのteratermを起動し、初めに表示される「Tera Term: 新しい接続」画面を×かキャンセルをクリックして閉じる。

②メニューの「設定」⇒「SSH鍵生成」の順にクリックする。

③「TTSSH: 鍵生成」画面で、鍵の種類を選択し「生成」をクリックする。RSAが一般的だが、ここではアルゴリズムの計算量が少なくて強度のある「ED25519」を選択する。

④「鍵のパスフレーズ」「パスフレーズの確認」「コメント」を入力して、「公開鍵の保存」をクリックする。

鍵のパスフレーズは鍵認証の際に入力するパスワードみたいなもの。5.OpenLDAPサーバの構築⑤ -LDAPユーザの設定で設定したSSHAのパスワードとは別物のため、ここでは「sshmanager」というパスフレーズを設定する。
コメントは任意のため、入れても入れなくてもよい。入れた場合、公開鍵の最後にその文字列が付加される。公開鍵自体の内容に影響するものではない。
「公開鍵の保存」をクリックすると、保存場所のダイアログが表示されるので、保存場所を決めて保存する。ファイル名は「id_ed25519.pub」。

⑤続けて「秘密鍵の保存」をクリックする。

保存場所のダイアログが表示されるので、保存場所を決めて保存する。ファイル名は「id_ed25519」。秘密鍵と公開鍵は対になるもので、誤って削除したりしないように気を付けるべし。

これでteratermによるssh公開鍵/秘密鍵の生成は完了。

 

・ssh-keygenコマンドでssh公開鍵/秘密鍵の生成方法

CLIでもssh公開鍵/秘密鍵を作成することができる。ldapサーバで以下のssh-keygenコマンドを実行する。

[root@ldapserver ~]# ssh-keygen -t ed25519 -f /tmp/id_ed25519 -N "sshmanager"
Generating public/private ed25519 key pair.
Your identification has been saved in /tmp/id_ed25519.
Your public key has been saved in /tmp/id_ed25519.pub.
The key fingerprint is:
SHA256:02Mooqy6SKrvfzZlfBLmGr56+HhJejRYaNpIqQTkE+U root@ldapserver
The key's randomart image is:
+--[ED25519 256]--+
|.o..             |
|o o              |
|.o E .           |
| .+ o . oo       |
|.o =.o.+S.+      |
|..o.o.=.*o..     |
| .o  * B o       |
|+.  o.@          |
|X+o.+Ooo         |
+----[SHA256]-----+

「-t」 : 鍵の種類を指定する。無指定の場合はrsaになる。今回はed25519を指定。
「-f」 : 生成するファイルの場所とファイル名をフルパスで指定する。ここでは適当に/tmp配下を指定。
「-N」 : パスフレーズを指定。teratermで鍵生成したときと同様に、「sshmanager」と指定。

lsコマンドでファイルが生成されたことを確認する。

[root@ldapserver ~]# ls -lrt /tmp
-rw-------. 1 root root 464 12月  9 18:25 id_ed25519
-rw-r--r--. 1 root root  97 12月  9 18:25 id_ed25519.pub

ssh-keygenコマンドひとつで、公開鍵と秘密鍵を両方生成してくれる。
これでCLIによるssh公開鍵/秘密鍵の生成は完了。

teratermで生成する方法と、CLIで生成する方法で違いは特になし。個人の好きなほうでOK。
※ただし、ssh-keygenコマンドで実行した場合、id_ed25519.pubの内容を見ると末尾に<ユーザ名>@<ホスト名>が付与される。これはteratermで生成するときの「コメント」に相当するもので、<ユーザ名>はssh-keygenコマンドを実行したときのユーザ名(rootユーザで実行すれば、root)が付与されるので、上記のようにrootユーザでssh-keygenを実行した場合は<ユーザ>@<ホスト名>の部分を削除するか、suコマンドでldapユーザに切り替えられるようになってから生成するのもあり。rootユーザで使用する公開鍵ではなく、あくまでldapユーザで使用する鍵であることに留意しておけばよい。


■ldapユーザにssh鍵認証設定

ここで、公開鍵の中身を見てみる。

[root@ldapserver ~]# cat /tmp/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP4UEX07INso0fBtT+Rt7HLHuvxOCx/CPAPh5K4j9Cf0

teratermで生成した場合は、メモ帳で開く。
この内容を、sshPublicKey属性に記述する必要があるので、コピペできるようにしておきたい。

次に、5.OpenLDAPサーバの構築⑤ -LDAPユーザの設定で設定したldapユーザをssh鍵認証に変更する。

ssh鍵認証用に変更するldifファイルを、以下の内容で記述する。

[root@ldapserver ~]# vi /root/ldif/usermod.ldif
dn: uid=user01,cn=ldapmanager,ou=Group,dc=abc,dc=def,dc=com
changetype: modify
add: objectClass
objectClass: ldapPublicKey
-
add: sshPublicKey
sshPublicKey: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP4UEX07INso0fBtT+Rt7HLHuvxOCx/CPAPh5K4j9Cf0

「dn」はユーザのdnを指定。5.OpenLDAPサーバの構築⑤ -LDAPユーザの設定で設定したときに指定した記述と同じにする。
「changetype」は変更種別で、今回は「modify」と記述する。
「add」は二つあるが、一つ目のaddは「objectClass」と記述する。その下の「objectClass」には「ldapPublicKey」と記述する。これで「sshPublicKey」属性が使用できるようになる。
オブジェクトクラスの「add」と属性の「add」を分けるために、「‐」(ハイフン)を挟む。
二つ目の「add」に「sshPublicKey」と記述し、その下に「sshPublicKey: 【id_ed25519.pubの内容】」を記述する。

上記のldifファイルを作成したら、ldapaddコマンドでユーザ変更を実行する。

[root@ldapserver ~]# ldapadd -x -D "cn=Manager,dc=abc,dc=def,dc=com" -w manager -f /root/ldif/usermod.ldif
modifying entry "uid=user01,cn=ldapmanager,ou=Group,dc=abc,dc=def,dc=com"

コマンド実行結果で「modifying entry ~」の後にエラーが出なければユーザ変更OK。
ldapsearchコマンドで変更されたかを確認する。

[root@ldapserver ~]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b 'dc=abc,dc=def,dc=com' 'uid=user01'
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: uid=user01,cn=ldapmanager,ou=Group,dc=abc,dc=def,dc=com
objectClass: top
objectClass: posixAccount
objectClass: account
objectClass: ldapPublicKey
gecos: ldapsystem manager
cn: user01
uid: user01
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/user01
loginShell: /bin/bash
userPassword:: e1NTSEF9cDVzYUpZNHVVM2NJdjFRY2RBczZVeTlGTkZuYjRWamo=
sshPublicKey: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP4UEX07INso0fBtT+Rt7HLHuvxOCx/CPAPh5K4j9Cf0

ldapsearchコマンドのオプションの説明は5.OpenLDAPサーバの構築⑤ -LDAPユーザの設定を参照。
オブジェクトクラスに「ldapPublicKey」、属性に「sshPublicKey」が追加されており、id_ed25519.pubの内容もしっかり反映されていることが確認できた。

これでldapユーザのssh鍵認証設定は完了!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA