見出し画像

390.2 ディレクトリの保護


主題390:OpenLDAP の設定
390.2 ディレクトリの保護

LinuC300の試験範囲である主題390~397まであるうちの「主題390:OpenLDAP の設定」から「390.2 ディレクトリの保護」についてのまとめ

  • 重要度:3

  • 説明:
    LDAPディレクトリに対する暗号化アクセスを設定し、ファイアウォールレベルでアクセスを制限できること。

  • 主要な知識範囲:
    - SSL/TLSを用いてLDAPディレクトリのセキュリティを保護
    - ファイアウォール設定の考慮事項
    - 非認証バインド
    - ユーザ名/パスワード認証方式
    - SASLユーザデータベースの保守
    - クライアント/サーバ証明書

  • 重要なファイル、用語、ユーティリティ:
    - SSL / TLS
    - セキュリティ強度係数 (SSF)
    - SASL
    - プロキシ認証
    - StartTLS
    - iptables


SSL/TLSを用いてLDAPディレクトリのセキュリティを保護

OpenLDAPはLDAP通信の保護をする手段としてStartTLSSSL/TLS(ldaps)、SASLをサポートしている。

~用語~

  • SSL/TLS(ldaps)
    SSL(Secure Sockets Layer)の後継がTLS(Transport Layer Security)で、TLSを使うのが推奨されいているが、SSLという用語がよく知られているためSSL/TLSという表記が残っているらしい。
    最新バージョンは2018年にリリースされた TLS1.3。
    SSL1.0、SSL2.0、SSL3.0、TLS1.0、TLS1.1 は脆弱性が指摘されおり、OSやブラウザなどで無効化が進んでいる。

  • StartTLS
    暗号化通信の機能を持たないプロトコルを暗号化通信にすることができるもので、暗号化通信のために別のポート番号を用意する必要がなく、通信相手のStartTLS対応状況に応じて暗号化通信/非暗号化通信が選択されるので通信相手の対応状況を意識する必要がないのが特徴。

  • SASL
    Simple Authentication and Security Layerの略で、ユーザー認証や通信の暗号化する機能を持たないプロトコルに対してユーザー認証や通信の暗号化する機能を提供するもの。

~セキュリティ強度係数~

サーバーを保護について相対的な強度を示すのにセキュリティ強度係数 (Security Strength Factor: SSF)を使う。
OpenLDAPではアクセス制御にSSFを設定することができる。

access to *
        by ssf=128 self write
        by ssf=64 anonymous auth
        by ssf=64 users read

~設定できるパラメータ~

  • ssf=
    全体的なセキュリティ強度係数

  • transport=
    トランスポートセキュリティ強度係数

  • tls=
    TLS セキュリティ強度係数

  • sasl=
    SASL セキュリティ強度係数

  • update_ssf=
    ディレクトリの更新に必要な全体的なセキュリティ強度係数

  • update_transport=
    ディレクトリの更新に必要なトランスポート セキュリティの強度係数

  • update_tls=
    ディレクトリの更新に必要な TLS セキュリティ強度係数

  • update_sasl=
    ディレクトリの更新に必要な SASL セキュリティ強度係数

  • simple_bind=
    ユーザー名/パスワード認証に必要なセキュリティ強度係数

~SSF設定で指定できる整数~

  • 1:有効

  • 1より大きい整数:暗号化の種類(おおよそ暗号鍵長と同じ)

    • 56=DES

    • 112=3DES

    • 128, 192, 256=AES

~サーバー設定~
サーバーのグローバル設定で証明書の保存場所や暗号化に関わるパラメータを指定できる。

  • TLSCACertificateFile:
    CA証明書ファイルを指定する。

  • TLSCACertificatePath:
    CA証明書ファイルが保存されいるパスを指定する。

  • TLSCertificateFile:
    サーバー証明書ファイルを指定する。

  • TLSCertificateKeyFile:
    サーバー証明書に対応する秘密鍵ファイルを指定する。

  • TLSCipherSuite:
    暗号化方式を指定する。

  • TLSRandFile:
    乱数を生成する/dev/urandomが使用できない場合に乱数を生成するファイルを指定する。

  • TLSDHParamFile:
    Diffie-Hellman方式のパラメータを指定する。

  • TLSECName:
    楕円曲線Diffie-Hellman方式のパラメータを指定する。

  • TLSVerifyClient:
    OpenLDAPサーバーがクライアントからの接続の際にクライアント証明書を要求するかどうかと証明書なしや不正な証明書の場合の振る舞いについて指定する。
    - never(既定値):クライアント証明書を要求しない
    - allow:クライアント証明書を要求し、証明書なしの場合は許可、不正な証明書も証明書なしと同じように振る舞う
    - try:クライアント証明書を要求し、証明書なしの場合は接続を許可、不正な証明書は接続を拒否
    - demand:クライアント証明書を要求し、証明書なしまたは不正な証明書の場合は接続を拒否

★ 後述「クライアント/サーバ証明書」で作成した証明書 ★
[root@rocky9-ldap27 ~]#
[root@rocky9-ldap27 ~]# cd /etc/openldap
[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# pwd
/etc/openldap
[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# ls -l
合計 9
drwxr-xr-x 2 root root    5  920 23:34 certs <---★ 証明書類を格納するディレクトリ
-rw-r--r-- 1 root root  121  921  2022 check_password.conf
-rw-r--r-- 1 root root  900 111  2022 ldap.conf
drwxr-xr-x 2 root root   32  919 23:04 schema
-rw-r--r-- 1 root root  452  920 00:53 setup-adduser-user00.ldif
-rw-r--r-- 1 root root  394  920 00:52 setup-domaintree.ldif
-rw-r--r-- 1 root root 1073  920 22:09 slapd.conf
drwx------ 3 ldap ldap    4  920 22:09 slapd.d
drwxr-x--- 3 ldap ldap    4  919 23:04 slapd.d.orig
[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# ls -l certs/
合計 6
-rw-r--r-- 1 root root  973  920 23:34 server.crt <---★ サーバー証明書
-rw-r--r-- 1 root root  883  920 23:33 server.csr <---★ サーバー証明書署名要求
-rw-r--r-- 1 root root 1704  920 23:32 server.key <---★ サーバー秘密鍵
[root@rocky9-ldap27 openldap]#

★ 設定変更前 ★
[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" "(cn=config)"
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: cn=config
objectClass: olcGlobal
cn: config
olcConfigFile: /etc/openldap/slapd.conf
olcConfigDir: /etc/openldap/slapd.d
olcAttributeOptions: lang-
olcAuthzPolicy: none
olcConcurrency: 0
olcConnMaxPending: 100
olcConnMaxPendingAuth: 1000
olcGentleHUP: FALSE
olcIdleTimeout: 0
olcIndexSubstrIfMaxLen: 4
olcIndexSubstrIfMinLen: 2
olcIndexSubstrAnyLen: 4
olcIndexSubstrAnyStep: 2
olcIndexHash64: FALSE
olcIndexIntLen: 4
olcListenerThreads: 1
olcLocalSSF: 71
olcLogLevel: Stats
olcLogFileOnly: FALSE
olcMaxFilterDepth: 1000
olcReadOnly: FALSE
olcReverseLookup: FALSE
olcSaslAuxpropsDontUseCopyIgnore: FALSE
olcSaslSecProps: noplain,noanonymous
olcSockbufMaxIncoming: 262143
olcSockbufMaxIncomingAuth: 16777215
olcThreads: 16
olcThreadQueues: 1
olcTLSCRLCheck: none
olcTLSVerifyClient: never
olcTLSProtocolMin: 0.0
olcToolThreads: 1
olcWriteTimeout: 0

[root@rocky9-ldap27 openldap]#

★ 設定変更用のLDIFを作成 ★
[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# vi setup-ssl.ldif
dn: cn=config
changetype: modify
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/server.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/server.key
[root@rocky9-ldap27 openldap]#

★ ldapadd で追加する★
[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# ldapadd -Y EXTERNAL -H ldapi:/// -f setup-ssl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

[root@rocky9-ldap27 openldap]#

★ 設定変更後 ★
[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" "(cn=config)"
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: cn=config
objectClass: olcGlobal
cn: config
olcConfigFile: /etc/openldap/slapd.conf
olcConfigDir: /etc/openldap/slapd.d
olcAttributeOptions: lang-
olcAuthzPolicy: none
olcConcurrency: 0
olcConnMaxPending: 100
olcConnMaxPendingAuth: 1000
olcGentleHUP: FALSE
olcIdleTimeout: 0
olcIndexSubstrIfMaxLen: 4
olcIndexSubstrIfMinLen: 2
olcIndexSubstrAnyLen: 4
olcIndexSubstrAnyStep: 2
olcIndexHash64: FALSE
olcIndexIntLen: 4
olcListenerThreads: 1
olcLocalSSF: 71
olcLogLevel: Stats
olcLogFileOnly: FALSE
olcMaxFilterDepth: 1000
olcReadOnly: FALSE
olcReverseLookup: FALSE
olcSaslAuxpropsDontUseCopyIgnore: FALSE
olcSaslSecProps: noplain,noanonymous
olcSockbufMaxIncoming: 262143
olcSockbufMaxIncomingAuth: 16777215
olcThreads: 16
olcThreadQueues: 1
olcTLSCRLCheck: none
olcTLSVerifyClient: never
olcTLSProtocolMin: 0.0
olcToolThreads: 1
olcWriteTimeout: 0
olcTLSCertificateFile: /etc/openldap/certs/server.crt <---★追加された
olcTLSCertificateKeyFile: /etc/openldap/certs/server.key <---★追加された

[root@rocky9-ldap27 openldap]#

~クライアント設定~
/etc/openldap/ldap.confで証明書の保存場所や暗号化に関わるパラメータを指定できる。

  • TLS_CACERT:
    TLSCACertificateFileと同じ。

  • TLS_CACERTDIR:
    TLSCACertificatePathと同じ。

  • TLS_CERT:
    クライアント証明書を指定する。

  • TLS_KEY:
    クライアント証明書に対応する秘密鍵を指定する。

  • TLS_RANDFILE:
    TLSRandFileと同じ。

  • TLS_REQCERT:
    TLSVerifyClientと同じだがdemandが既定値。
    ldapsearchをして「ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)」というエラーで接続できない場合はallowかneverにすると接続できるようになる。

[root@rocky9-ldap27 openldap]# 
[root@rocky9-ldap27 openldap]# vi ldap.conf
     :
     :
TLS_REQCERT never <---★ 追加する 

[root@rocky9-ldap27 openldap]#

~接続確認~

ローカルホストの場合:-H ldapi:///

[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# ldapsearch -LLL -x -W -H ldapi:/// -D "cn=Manager,dc=example,dc=co,dc=jp" -b "dc=example,dc=co,dc=jp" uid=user00
Enter LDAP Password: ********
dn: uid=user00,ou=Users,dc=example,dc=co,dc=jp
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: user00
sn: example
userPassword:: e1NTSEF9ZUxPdWMzU2lySDhpcDJHUEx0TEloUXRrRHRBUjNBbEc=
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/user00
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0
uid: user00

[root@rocky9-ldap27 openldap]#

★ ログを確認(loglevel 256) ★
[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# tail -f /var/log/slapd/slapd.log
  :
Sep 21 00:37:37 rocky9-ldap27 slapd[982]: conn=1006 fd=11 ACCEPT from PATH=/var/run/ldapi (PATH=/var/run/ldapi)
Sep 21 00:37:37 rocky9-ldap27 slapd[982]: conn=1006 op=0 BIND dn="cn=Manager,dc=example,dc=co,dc=jp" method=128
Sep 21 00:37:37 rocky9-ldap27 slapd[982]: conn=1006 op=0 BIND dn="cn=Manager,dc=example,dc=co,dc=jp" mech=SIMPLE bind_ssf=0 ssf=71
Sep 21 00:37:37 rocky9-ldap27 slapd[982]: conn=1006 op=0 RESULT tag=97 err=0 qtime=0.000009 etime=0.000047 text=
Sep 21 00:37:37 rocky9-ldap27 slapd[982]: conn=1006 op=1 SRCH base="dc=example,dc=co,dc=jp" scope=2 deref=0 filter="(uid=user00)"
Sep 21 00:37:37 rocky9-ldap27 slapd[982]: conn=1006 op=1 SEARCH RESULT tag=101 err=0 qtime=0.000008 etime=0.000124 nentries=1 text=
Sep 21 00:37:37 rocky9-ldap27 slapd[982]: conn=1006 op=2 UNBIND
Sep 21 00:37:37 rocky9-ldap27 slapd[982]: conn=1006 fd=11 closed
  :
[root@rocky9-ldap27 openldap]#

暗号化されていないLDAP通信の場合:-H ldap://ip.add.re.ss/

[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# ldapsearch -LLL -x -W -H ldap://192.168.56.27/ -D
 "cn=Manager,dc=example,dc=co,dc=jp" -b "dc=example,dc=co,dc=jp" uid=user00
Enter LDAP Password: ********
dn: uid=user00,ou=Users,dc=example,dc=co,dc=jp
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: user00
sn: example
userPassword:: e1NTSEF9ZUxPdWMzU2lySDhpcDJHUEx0TEloUXRrRHRBUjNBbEc=
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/user00
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0
uid: user00

[root@rocky9-ldap27 openldap]#

★ ログを確認(loglevel 256) ★
[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# tail -f /var/log/slapd/slapd.log
  :
Sep 21 00:37:07 rocky9-ldap27 slapd[982]: conn=1005 fd=11 ACCEPT from IP=192.168.56.27:46264 (IP=0.0.0.0:389)
Sep 21 00:37:07 rocky9-ldap27 slapd[982]: conn=1005 op=0 BIND dn="cn=Manager,dc=example,dc=co,dc=jp" method=128
Sep 21 00:37:07 rocky9-ldap27 slapd[982]: conn=1005 op=0 BIND dn="cn=Manager,dc=example,dc=co,dc=jp" mech=SIMPLE bind_ssf=0 ssf=0
Sep 21 00:37:07 rocky9-ldap27 slapd[982]: conn=1005 op=0 RESULT tag=97 err=0 qtime=0.000038 etime=0.000162 text=
Sep 21 00:37:07 rocky9-ldap27 slapd[982]: conn=1005 op=1 SRCH base="dc=example,dc=co,dc=jp" scope=2 deref=0 filter="(uid=user00)"
Sep 21 00:37:07 rocky9-ldap27 slapd[982]: conn=1005 op=1 SEARCH RESULT tag=101 err=0 qtime=0.000018 etime=0.000183 nentries=1 text=
Sep 21 00:37:07 rocky9-ldap27 slapd[982]: conn=1005 op=2 UNBIND
Sep 21 00:37:07 rocky9-ldap27 slapd[982]: conn=1005 fd=11 closed
  :
[root@rocky9-ldap27 openldap]#

暗号化されているLDAP通信の場合:-H ldaps://ip.add.re.ss/
loglevel 256で設定されたログを確認すると TLS established ~ が記録される。

[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# ldapsearch -LLL -x -W -H ldaps://192.168.56.27/ -D "cn=Manager,dc=example,dc=co,dc=jp" -b "dc=example,dc=co,dc=jp" uid=user00
Enter LDAP Password: ********
dn: uid=user00,ou=Users,dc=example,dc=co,dc=jp
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: user00
sn: example
userPassword:: e1NTSEF9ZUxPdWMzU2lySDhpcDJHUEx0TEloUXRrRHRBUjNBbEc=
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/user00
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0
uid: user00

[root@rocky9-ldap27 openldap]#

★ ログを確認(loglevel 256) ★
[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# tail -f /var/log/slapd/slapd.log
  :
Sep 21 00:36:33 rocky9-ldap27 slapd[982]: conn=1003 fd=11 ACCEPT from IP=192.168.56.27:59708 (IP=0.0.0.0:636)
Sep 21 00:36:33 rocky9-ldap27 slapd[982]: conn=1003 fd=11 TLS established tls_ssf=256 ssf=256 tls_proto=TLSv1.3 tls_cipher=TLS_AES_256_GCM_SHA384
Sep 21 00:36:33 rocky9-ldap27 slapd[982]: conn=1003 op=0 BIND dn="cn=Manager,dc=example,dc=co,dc=jp" method=128
Sep 21 00:36:33 rocky9-ldap27 slapd[982]: conn=1003 op=0 BIND dn="cn=Manager,dc=example,dc=co,dc=jp" mech=SIMPLE bind_ssf=0 ssf=256
Sep 21 00:36:33 rocky9-ldap27 slapd[982]: conn=1003 op=0 RESULT tag=97 err=0 qtime=0.000009 etime=0.000055 text=
Sep 21 00:36:33 rocky9-ldap27 slapd[982]: conn=1003 op=1 SRCH base="dc=example,dc=co,dc=jp" scope=2 deref=0 filter="(uid=user00)"
Sep 21 00:36:33 rocky9-ldap27 slapd[982]: conn=1003 op=1 SEARCH RESULT tag=101 err=0 qtime=0.000005 etime=0.000118 nentries=1 text=
Sep 21 00:36:33 rocky9-ldap27 slapd[982]: conn=1003 op=2 UNBIND
Sep 21 00:36:33 rocky9-ldap27 slapd[982]: conn=1003 fd=11 closed
  :
[root@rocky9-ldap27 openldap]#

StartTLSを使ったLDAP通信の場合:-Z -H ldap://ip.add.re.ss/
loglevel 256で設定されたログを確認すると STARTTLS が記録される。

[root@rocky9-ldap27 openldap]# 
[root@rocky9-ldap27 openldap]# vi ldap.conf
     :
     :
TLS_REQCERT never <---★ 追加する 
ssl start_tls <---★ 追加する

[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 ~]#
[root@rocky9-ldap27 ~]# ldapsearch -LLL -Z -W -H ldap://192.168.56.27/ -D "cn=Manager,dc=example,dc=co,dc=jp" -b "dc=example,dc=co,dc=jp" uid=user00
Enter LDAP Password: ********
dn: uid=user00,ou=Users,dc=example,dc=co,dc=jp
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: user00
sn: example
userPassword:: e1NTSEF9ZUxPdWMzU2lySDhpcDJHUEx0TEloUXRrRHRBUjNBbEc=
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/user00
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0
uid: user00

[root@rocky9-ldap27 ~]#

★ ログを確認(loglevel 256) ★
[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# tail -f /var/log/slapd/slapd.log
  :
Sep 26 21:48:46 rocky9-ldap27 slapd[162]: conn=1010 fd=11 ACCEPT from IP=192.168.56.27:46610 (IP=0.0.0.0:389)
Sep 26 21:48:46 rocky9-ldap27 slapd[162]: conn=1010 op=0 EXT oid=1.3.6.1.4.1.1466.20037
Sep 26 21:48:46 rocky9-ldap27 slapd[162]: conn=1010 op=0 STARTTLS
Sep 26 21:48:46 rocky9-ldap27 slapd[162]: conn=1010 op=0 RESULT oid= err=0 qtime=0.000010 etime=0.000045 text=
Sep 26 21:48:46 rocky9-ldap27 slapd[162]: conn=1010 fd=11 TLS established tls_ssf=256 ssf=256 tls_proto=TLSv1.3 tls_cipher=TLS_AES_256_GCM_SHA384
Sep 26 21:48:49 rocky9-ldap27 slapd[162]: conn=1010 op=1 BIND dn="cn=Manager,dc=example,dc=co,dc=jp" method=128
Sep 26 21:48:49 rocky9-ldap27 slapd[162]: conn=1010 op=1 BIND dn="cn=Manager,dc=example,dc=co,dc=jp" mech=SIMPLE bind_ssf=0 ssf=256
Sep 26 21:48:49 rocky9-ldap27 slapd[162]: conn=1010 op=1 RESULT tag=97 err=0 qtime=0.000018 etime=0.000129 text=
Sep 26 21:48:49 rocky9-ldap27 slapd[162]: conn=1010 op=2 SRCH base="dc=example,dc=co,dc=jp" scope=2 deref=0 filter="(uid=user00)"
Sep 26 21:48:49 rocky9-ldap27 slapd[162]: conn=1010 op=2 SEARCH RESULT tag=101 err=0 qtime=0.000012 etime=0.000178 nentries=1 text=
Sep 26 21:48:49 rocky9-ldap27 slapd[162]: conn=1010 op=3 UNBIND
Sep 26 21:48:49 rocky9-ldap27 slapd[162]: conn=1010 fd=11 closed
  :
[root@rocky9-ldap27 openldap]#

(参考文献)


ファイアウォール設定の考慮事項

LDAP通信で使われるポート番号:
- ldap:TCP 389
- LDAP over SSL/TLS = ldaps:TCP/636
- StartTLS:TCP 389

[root@rocky9-ldap21 ~]#
[root@rocky9-ldap21 ~]# grep -i ldap /etc/services
ldap            389/tcp
ldap            389/udp
ldaps           636/tcp                         # LDAP over SSL
ldaps           636/udp                         # LDAP over SSL
www-ldap-gw     1760/tcp                # www-ldap-gw
www-ldap-gw     1760/udp                # www-ldap-gw
msft-gc-ssl     3269/tcp                # Microsoft Global Catalog with LDAP/SSL
msft-gc-ssl     3269/udp                # Microsoft Global Catalog with LDAP/SSL
ldap-admin      3407/tcp                # LDAP admin server port
ldap-admin      3407/udp                # LDAP admin server port
bmc_ctd_ldap    6301/tcp  bmc-ctd-ldap  # BMC CONTROL-D LDAP SERVER
bmc_ctd_ldap    6301/udp  bmc-ctd-ldap  # BMC CONTROL-D LDAP SERVER
[root@rocky9-ldap21 ~]#

レプリケーションを利用している場合は、OpenLDAP2.4~はPULL型のsyncreplを使うことになるので、コンシューマからプロバイダに向かってTCPコネクションが張られる。

★ プロバイダ側のネットワーク状況 ★
[root@rocky9-ldap21 ~]#
[root@rocky9-ldap21 ~]# ss -ant
State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port    Process
LISTEN    0         2048               0.0.0.0:636              0.0.0.0:*
LISTEN    0         2048               0.0.0.0:389              0.0.0.0:*
ESTAB     0         0            192.168.56.21:389        192.168.56.22:41646
[root@rocky9-ldap21 ~]#
★ コンシューマ側のネットワーク状況 ★
[root@rocky9-ldap22 ~]#
[root@rocky9-ldap22 ~]# ss -ant
State     Recv-Q    Send-Q       Local Address:Port         Peer Address:Port   Process
LISTEN    0         2048               0.0.0.0:389               0.0.0.0:*
LISTEN    0         2048               0.0.0.0:636               0.0.0.0:*
ESTAB     0         0            192.168.56.22:41646       192.168.56.21:389
[root@rocky9-ldap22 ~]#

(補足1)
systemd環境でOpenLDAPのポート番号を変更するにはslapdのユニットファイルを編集する。

[root@rocky9-ldap21 ~]#
[root@rocky9-ldap21 ~]# ls -l /usr/lib/systemd/system/slapd.service
-rw-r--r-- 1 root root 435  921  2022 /usr/lib/systemd/system/slapd.service
[root@rocky9-ldap21 ~]#
[root@rocky9-ldap21 ~]# vi /usr/lib/systemd/system/slapd.service
[Unit]
Description=OpenLDAP Server Daemon
After=syslog.target network-online.target
Documentation=man:slapd
Documentation=man:slapd-config
Documentation=man:slapd-mdb
Documentation=file:///usr/share/doc/openldap-servers/guide.html

[Service]
Type=forking
ExecStartPre=/usr/libexec/openldap/check-config.sh
ExecStart=/usr/sbin/slapd -u ldap -h "ldap://:1389/ ldaps://:1389/ ldapi:///"

[Install]
WantedBy=multi-user.target
Alias=openldap.service
[root@rocky9-ldap21 ~]#
[root@rocky9-ldap21 ~]# systemctl daemon-reload
[root@rocky9-ldap21 ~]#
[root@rocky9-ldap21 ~]# systemctl restart slapd
[root@rocky9-ldap21 ~]#
[root@rocky9-ldap21 ~]# ss -antl
State    Recv-Q   Send-Q     Local Address:Port     Peer Address:Port  Process
LISTEN   0        2048             0.0.0.0:1689          0.0.0.0:*
LISTEN   0        2048             0.0.0.0:1389          0.0.0.0:*
[root@rocky9-ldap21 ~]#

(補足2)
他のディストリビューションでは、/etc/sysconfig/slapdという設定ファイルでSLAPD_URLS="ldapi:/// ldap:/// ldaps:///"という設定をする場合もある。


非認証バインド

LDAPにバインド(接続)する方法には3種類ある。
- 匿名、anonymous
- 非認証
- ユーザー名/パスワード 認証

~匿名、anonymous~
ユーザー名もパスワード必要ないバインド。
有効化:allow bind_anon(既定値)
無効化:disallow bind_anon

slapd-config形式

dn: cn=config
changetype: modify
add: olcDisallows
olcDisallows: bind_anon

slapd.conf形式
グローバル設定なのでschema設定、backend設定、database設定よりも前に記述する。
既定値から変更するときのみ記述する。

disallow bind_anon

~非認証~
ユーザー名だけでバインドできる。
有効化:allow bind_anon_cred
無効化:disallow bind_anon_cred(既定値)

slapd-config形式

dn: cn=config
changetype: modify
add: olcAllows
olcAllows: bind_anon_cred

slapd.conf形式
グローバル設定なのでschema設定、backend設定、database設定よりも前に記述する。
既定値から変更するときのみ記述する。

allow bind_anon_cred

~認証~
ユーザ名/パスワードでバインドする。
有効化:allow bind_simple(既定値)
無効化:disallow bind_simple

slapd-config形式

dn: cn=config
changetype: modify
add: olcDisallows
olcDisallows: bind_simple

slapd.conf形式
グローバル設定なのでschema設定、backend設定、database設定よりも前に記述する。
既定値から変更するときのみ記述する。

disallow bind_simple

ユーザ名/パスワード認証方式

~特徴~

  • 既定値で有効化されている。
    disallow bind_simple設定で無効化することができる。

  • 通信を暗号化する機能はないので、SSL/TLS、StartTLS、VPN等の別の手段で通信を暗号化する必要がある。

  • ユーザーのパスワードは通常userPassword属性に格納されるが、SASLデータベースを使用することもできる。


SASLユーザデータベースの保守

ユーザーのパスワードは通常userPassword属性に格納される。
このときパスワードは暗号化(もしくはハッシュ化)されせるためにいくつかの方法がある。

  • SSHA形式
    slapdでサポートされている最も安全なパスワード形式
    例) {SSHA}DkMTwBl+a/3DQTxCYEApdUtNXGgdUac3

  • CRYPT形式
    例) {CRYPT}aUihad99hmev6
    例) {CRYPT}$1$czBJdDqS$TmkzUAb836oMxg/BmIwN.1

  • MD5形式
    例) {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==

  • SMD5形式
    例) {SMD5}4QWGWZpj9GCmfuqEvm8HtZhZS6E=

  • SHA形式
    例) {SHA}5en6G6MezRroT3XKqkdPOmY/BfQ=

  • SASL方式
    パスワード検証を別のプロセスに任せる。
    LDAPセッションを安全にするためのSASLとは異なる。

~SASLデータベース~
saslpasswd2とsasldblistusers2というコマンドがある。
データベースの実体は/etc/sasl2/sasldb2。

[root@rocky9-ldap27 openldap]#
[root@rocky9-ldap27 openldap]# saslpasswd2

This product includes software developed by Computing Services
at Carnegie Mellon University (http://www.cmu.edu/computing/).

saslpasswd2: usage: saslpasswd2 [-v] [-c [-p] [-n]] [-d] [-a appname] [-f sasldb] [-u DOM] userid
        -p      pipe mode -- no prompt, password read on stdin
        -c      create -- ask mechs to create the account
        -d      disable -- ask mechs to disable/delete the account
        -n      no userPassword -- don't set plaintext userPassword property
                                   (only set mechanism-specific secrets)
        -f sasldb       use given file as sasldb
        -a appname      use appname as application name
        -u DOM  use DOM for user domain
        -v      print version numbers and exit
[root@rocky9-ldap27 openldap]# 
[root@rocky9-ldap27 sasl2]#
[root@rocky9-ldap27 sasl2]# sasldblistusers2 -h

This product includes software developed by Computing Services
at Carnegie Mellon University (http://www.cmu.edu/computing/).

sasldblistusers2: usage: sasldblistusers2 [-v] [[-f] sasldb]
        -f sasldb       use given file as sasldb
        -v      print version numbers and exit
[root@rocky9-ldap27 sasl2]#

~コマンド~
saslpasswd2

  • -c -u <ドメイン名> <ユーザーID>
    SASLデータベースにユーザーを追加

[root@rocky9-ldap27 sasl2]#
[root@rocky9-ldap27 sasl2]# saslpasswd2 -c -u example.co.jp user01
Password: ********
Again (for verification): ********
[root@rocky9-ldap27 sasl2]#
[root@rocky9-ldap27 sasl2]# sasldblistusers2
user01@example.co.jp: userPassword
[root@rocky9-ldap27 sasl2]#
  • -d -u <ドメイン名> <ユーザーID>
    SASLデータベースにユーザーの削除

[root@rocky9-ldap27 sasl2]#
[root@rocky9-ldap27 sasl2]# sasldblistusers2
user01@example.co.jp: userPassword
[root@rocky9-ldap27 sasl2]#
[root@rocky9-ldap27 sasl2]# saslpasswd2 -d -u example.co.jp user01
[root@rocky9-ldap27 sasl2]#
[root@rocky9-ldap27 sasl2]# sasldblistusers2
[root@rocky9-ldap27 sasl2]#

(参考文献)


クライアント/サーバ証明書

~用語~

  • CA(Certification Authority)認証局
    SSL/TLS証明書を発行する機関のことで、大手の認証局はシマンテック、グローバルサイン、GMO、セコム などが、無料のものでは Let’s Encrypt などがある。
    プライベートな証明書など、証明することに対して厳密さを求めないものであれば、自前でCA認証局を構築し署名をすることができる。
    (いわゆる プライベート認証局、自己認証局、オレオレ認証局)

  • クライアント証明書
    正規な利用者であることを証明するもの。
    ネットバンクやVPNなどのユーザー認証、セキュリティカードなどに使われる。
    OpenLDAPではユーザーアカウントのuserCertificate属性でクライアント証明書を登録することができる。

  • サーバー証明書
    正規なサーバーであることを証明するもの。
    身近なものには https:// のWEBサイトがある。
    OpenLDAPでは ldaps:// となり、TCP:636 が使われる。

~証明書を作る基本的な流れ~

  1. 秘密鍵を作成する。
    openssl genrsa コマンド

  2. 秘密鍵をもとに証明書署名要求(CSR:Certificate Signing Request)を作成する。
    openssl req コマンド

  3. CA認証局が証明書署名要求(CSR)にCA署名をして証明書が作成される。
    openssl ca コマンド


参考文献


この記事が気に入ったらサポートをしてみませんか?