LoginSignup
0
0

【KVM入門⑤】〜LDAPを使ってユーザ情報などを一元管理する〜

Last updated at Posted at 2024-06-02

KVM入門一覧

  1. 【KVM入門⓪】〜Linuxの基礎知識〜
  2. 【KVM入門①】〜KVMを使って仮想マシンを作成する〜
  3. 【KVM入門②】〜複数の仮想マシンを作成して仮想マシン間で通信を行えるようにする〜
  4. 【KVM入門③】〜DNSとhostsの設定を行う〜
  5. 【KVM入門④】〜NFSを使って全ての仮想マシンでファイルを共有する〜
  6. 【KVM入門⑤】〜LDAPを使ってユーザ情報などを一元管理する〜👈今ここ

はじめに

KVMシリーズ第5回です。

今回は、LDAPを使ってユーザ情報などを一元管理できるようにしていきます。

ホスト名の設定と/etc/hostsの設定は終わっているものとします。

test-vm1をサーバ、test-vm1からtest-vm4をクライアントとして、以下の図の赤色の部分の設定をするところまでをこの回の目標とします。

image.png

すること

サーバ側(test-vm1

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

パッケージマネージャのアップデートを行う。

sudo dnf update -y

必要なパッケージをインストールする。

sudo dnf install -y epel-release
dnf install -y openldap-servers openldap-clients

サービスの起動と自動起動の有効化を行う。

sudo systemctl enable --now slapd

2. ファイアウォールの設定

sudo firewall-cmd --add-service={ldap,ldaps} --permanent
sudo firewall-cmd --reload

以下のように表示されればファイアウォールの設定は成功している。

[xxx@vm1 ~]# sudo firewall-cmd --add-service={ldap,ldaps} --permanent
success
[xxx@vm1 ~]# sudo firewall-cmd --reload
success
[xxx@vm1 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp1s0
  sources:
  services: cockpit dhcpv6-client nfs ldap ldaps ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

3. OpenLDAPサーバの初期設定

cd /etc/openldap/schema

ハッシュ値の取得を行う。

slappasswd

以下のように表示される。
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxの部分をコピーしておく。

[xxx@vm1 schema]# slappasswd
New password:
Re-enter new password:
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

ルートパスワードの変更用の設定ファイルを作成する。

vi changerootpass.ldif
changerootpass.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: <コピーしたハッシュ値>

設定ファイルから設定を追加する。

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f changerootpass.ldif

デフォルトで配置されている3つのファイルを読み込んで設定を追加する。

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

サービスの再起動を行う。

sudo systemctl restart slapd

4. ドメインの設定

vi setdomain.ldif
setdomain.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=Manager,dc=test,dc=internal" read by * none

dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=test,dc=internal

dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=test,dc=internal

dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: <コピーしたハッシュ値>

dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="cn=Manager,dc=test,dc=internal" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=test,dc=internal" write by * read
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f setdomain.ldif

以下のように表示されればドメインの設定は成功している。

[xxx@vm1 schema]# sudo ldapsearch -H ldap:// -x -s base -b "" -LLL "namingContexts"
dn:
namingContexts: dc=test,dc=internal

5. 組織とグループの設定

vi addou.ldif
addou.ldif
dn: dc=test,dc=internal
objectClass: top
objectClass: dcObject
objectclass: organization
o: My test Organisation
dc: test

dn: cn=Manager,dc=test,dc=internal
objectClass: organizationalRole
cn: Manager
description: OpenLDAP Manager

dn: ou=People,dc=test,dc=internal
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=test,dc=internal
objectClass: organizationalUnit
ou: Group
sudo ldapadd -x -D cn=Manager,dc=test,dc=internal -W -f addou.ldif

以下のように表示されれば組織とグループの設定は成功している。

[xxx@vm1 schema]# sudo ldapsearch -x -b "dc=test,dc=internal" ou
# extended LDIF
#
# LDAPv3
# base <dc=test,dc=internal> with scope subtree
# filter: (objectclass=*)
# requesting: ou
#

# test.internal
dn: dc=test,dc=internal

# Manager, test.internal
dn: cn=Manager,dc=test,dc=internal

# People, test.internal
dn: ou=People,dc=test,dc=internal
ou: People

# Group, test.internal
dn: ou=Group,dc=test,dc=internal
ou: Group

# search result
search: 2
result: 0 Success

# numResponses: 5
# numEntries: 4

6. ユーザの追加

slappaddwd
[xxx@vm1 schema]# slappasswd
New password:
Re-enter new password:
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
vi adduser.ldif
adduser.ldif
dn: uid=testuser,ou=People,dc=test,dc=internal
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: testuser
sn: temp
userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
loginShell: /bin/bash
uidNumber: 2000
gidNumber: 2000
homeDirectory: /home/testuser
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0

dn: cn=rocky,ou=Group,dc=test,dc=internal
objectClass: posixGroup
cn: testuser
gidNumber: 2000
memberUid: testuser
sudo ldapadd -x -D cn=Manager,dc=test,dc=internal -W -f adduser.ldif

以下のように表示されればユーザの追加に成功している。

[xxx@vm1 schema]# sudo ldapsearch -x -b "ou=People,dc=test,dc=internal"
# extended LDIF
#
# LDAPv3
# base <ou=People,dc=test,dc=internal> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# People, test.internal
dn: ou=People,dc=test,dc=internal
objectClass: organizationalUnit
ou: People

# testuser, People, test.internal
dn: uid=testuser,ou=People,dc=test,dc=internal
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: testuser
sn: temp
loginShell: /bin/bash
uidNumber: 2000
gidNumber: 2000
homeDirectory: /home/testuser
shadowMax: 0
shadowWarning: 0
uid: testuser

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2

7. SSL/TLSの設定

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/ldapserver.key -out /etc/pki/tls/ldapserver.crt

以下の3つのファイルをまとめて/etc/openldap/certs/にコピーする。

  • /etc/pki/tls/ldapserver.crt
  • /etc/pki/tls/ldapserver.key
  • /etc/pki/tls/certs/ca-bundle.crt
sudo cp /etc/pki/tls/ldapserver.crt /etc/pki/tls/ldapserver.key /etc/pki/tls/certs/ca-bundle.crt /etc/openldap/certs/
sudo chown ldap:ldap /etc/openldap/certs/{ldapserver.crt,ldapserver.key,ca-bundle.crt}
sudo chmod 600 ldapserver.key
vi tls.ldif
tls.ldif
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/certs/ca-bundle.crt

dn: cn=config
changetype: modify
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/ldapserver.crt

dn: cn=config
changetype: modify
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/ldapserver.key

(※まだ完璧に理解できておらず、olcTLSCACertificateFileをca-bundle.crtにするのかが怪しいです。理解でき次第追記します。分かる方がいればコメントよろしくお願いします。)

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f tls.ldif
vi /etc/openldap/ldap.conf
/etc/openldap/ldap.conf
TLS_CACERT     /etc/openldap/certs/ca-bundle.crt

# because you're using Self-Signed Certificate - you must add this
TLS_REQCERT never
sudo systemctl restart slapd
以下のように表示されればSSL/TLSの設定は成功している。
[xxx@vm1 certs]# sudo ldapsearch -x -b dc=test,dc=internal -ZZ
# extended LDIF
#
# LDAPv3
# base <dc=test,dc=internal> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# test.internal
dn: dc=test,dc=internal
objectClass: top
objectClass: dcObject
objectClass: organization
o: My test Organisation
dc: test

# Manager, test.internal
dn: cn=Manager,dc=test,dc=internal
objectClass: organizationalRole
cn: Manager
description: OpenLDAP Manager

# People, test.internal
dn: ou=People,dc=test,dc=internal
objectClass: organizationalUnit
ou: People

# Group, test.internal
dn: ou=Group,dc=test,dc=internal
objectClass: organizationalUnit
ou: Group

# testuser, People, test.internal
dn: uid=testuser,ou=People,dc=test,dc=internal
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: testuser
sn: temp
loginShell: /bin/bash
uidNumber: 2000
gidNumber: 2000
homeDirectory: /home/testuser
shadowMax: 0
shadowWarning: 0
uid: testuser

# search result
search: 3
result: 0 Success

# numResponses: 6
# numEntries: 5

クライアント側(test-vm1からtest-vm4

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

sudo dnf update -y
sudo dnf install -y epel-release
sudo dnf install -y openldap-clients sssd sssd-ldap oddjob-mkhomedir

2. SSSDの起動

sudo authselect select sssd with-mkhomedir --force
sudo systemctl enable --now oddjobd.service

3. OpenLDAPとSSSDの設定

sudo vi /etc/openldap/ldap.conf
/etc/openldap/ldap.conf
BASE dc=test,dc=internal
URI ldap://vm1.test.internal/
sudo vi /etc/sssd/sssd.conf
/etc/sssd/sssd.conf
[domain/default]
id_provider = ldap
autofs_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldap://vm1.test.internal/
ldap_search_base = dc=test,dc=internal
ldap_id_use_start_tls = True
ldap_tls_cacertdir = /etc/openldap/certs
cache_credentials = True
ldap_tls_reqcert = allow

[sssd]
services = nss, pam, autofs
domains = default

[nss]
homedir_substring = /home
sudo chmod 600 /etc/sssd/sssd.conf
sudo systemctl enable --now sssd

4. 接続

一旦ログアウトして、作成したユーザでログインできれば成功。

[root@vm2 ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@vm2 ~]# whoami
root
[root@vm2 ~]# exit
logout

Rocky Linux 9.4 (Blue Onyx)
Kernel 5.14.0-427.18.1.el9_4.x86_64 on an x86_64

vm2 login: testuser
Password:
Last login: Sat Jun  1 04:38:42 on ttyS0
[testuser@vm2 ~]$ id
uid=2000(testuser) gid=2000 groups=2000 context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[testuser@vm2 ~]$ whoami
testuser

解説

NISとLDAPの違い

NISやLDAP、DNSなどのことをネームサービスという1

Network Information Service(NIS)とは、複数のコンピュータ間でシステムの設定情報を共有することができるシステムのことである2

NISを使うことでホスト名やユーザ情報の管理ができるが、セキュリティ上の問題3などにより、現在はホスト名の管理にはDNS、ユーザ情報の管理にはLDAPを用いるのが主流となっている。

実際、Rocky Linux 9でもNISの技術は安全とはみなされなくなったことが原因でNISパッケージが削除されており4、NISの代替手段としてLDAPを挙げている5

LDAPを使うことで、下の図のようにユーザ情報などの各種データを集中管理することができる。
image.png
LDAPを用いて各種データを集中管理する様子6

DC, OU, CNについて

LDAPを構成する要素として、Domain Composenent (DC), Organization Unit Name (OU), Common Name (CN)などがある7

image.png
LDAPのツリー構成8

上の図のように、DCは組織、OUは組織内のグループ、CNはユーザを表す。

ただしDCに関しては、上の図では2つであるが、数に制限はなく、さらにドメインを使う必要もない8

SSL/TLSの仕組み

SSL/TLSとは、インターネットでの送受信において、なりすましや盗聴、改ざんなどを防ぐための暗号化プロトコルである9

image.png
SSL/TLSを使った通信の流れ10

上の図のように、①から⑦の流れで通信を行う。

ポイントは以下の2つである。

  1. 送られてきたSSL証明書と、ブラウザに最初から入ってるルート証明書を照合している点
  2. クライアント側で、公開鍵を使って共通鍵を暗号化している点

以下の図は「※サーバー側で準備」と書かれている部分で省略されているサーバ証明書を発行するときの流れを示す。(※サーバ証明書とSSL証明書は同じ意味)

image.png
サーバ証明書を発行するときの流れ11

OpenLDAPではサーバ側で以下の3つを設定する。
ただし、今回はオレオレ証明書を使用するためWebサーバと認証局(CA)が同一である。

  1. CA証明書(olcTLSCACertificateFile)
    • OpenLDAPサーバが信頼する認証局(CA)の証明書を格納したファイル(*.crt)を指定
    • /etc/pki/tls/certs/ca-bundle.crtのこと
  2. サーバ証明書(olcTLSCertificateFile)
    • OpenLDAPサーバが自身を証明するために使用する証明書を格納したファイル(*.crt)を指定
    • 上の図でいうサーバ証明書(CRT)のこと
  3. サーバ証明書の秘密鍵(olcTLSCertificateKeyFile)
    • サーバ証明書に対応する秘密鍵を格納したファイル(*.key)を指定
    • 上の図でいうPrivate Keyのこと

さいごに

今回はLDAPを使ってユーザ情報などを一元管理する方法を紹介しました。

これでKVMシリーズは終了です。

読んでいただきありがとうございました!

  1. NIS、NIS+、DNSなどの違いについて. http://home.t00.itscom.net/happy7/solaris/omake.htm

  2. IT用語辞典. NIS 【Network Information Service】. https://e-words.jp/w/NIS.html

  3. 3.4.2 NISの問題点. https://www.ikueikan.ac.jp/biblion/1998/netadmin/node61.html

  4. Red Hat Customer Portal. 14.4 削除された機能. https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/considerations_in_adopting_rhel_9/ref_removed-functionality-identity-management_assembly_identity-management

  5. Red Hat Customer Portal. What is the support status of Network Information Service (NIS). https://access.redhat.com/solutions/5991271

  6. そろそろLDAPにしてみないか?. 第1回 まずは使ってみよう. https://gihyo.jp/admin/serial/01/ldap/0001

  7. Active Directoryで出てくる用語 (DN, OU, DC, CN など). https://akrad.hatenablog.com/entry/2018/06/17/212505

  8. 【LDAP基礎用語】DCとは?OUとは?バインドDN,ベースDN,サフィックスとは?匿名バインドとは?ldapsearchのオプション. https://milestone-of-se.nesuke.com/l7protocol/ldap/binddn-basedn/ 2

  9. SSLとTLSとは?意外に知らないSSLとTLSの違い(簡単編). https://www.idcf.jp/rentalserver/aossl/basic/ssl-tls/

  10. HTTPS通信(SSL/TLS)の流れを5分で理解する(図解つき). https://btj0.com/blog/web/https-ssl-tls/

  11. オレオレ証明書をopensslで作る(詳細版). https://ozuma.hatenablog.jp/entry/20130511/1368284304

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0