pikesaku’s blog

個人的な勉強メモです。記載内容について一切の責任は持ちません。

OpenLDAPサーバ構築(Ver2.4・RHEL8)

ポイント

  • 設定もLDAPで管理(Configuration Backend)
  • 設定ディレクトリ(/etc/openldap/slapd.d/cn\=config)配下のldifファイルの内容が設定される。
  • 設定ディレクトリ配下のファイルの直接編集は推奨されない
  • バックエンドDBの推奨はmdb(Lightning Memory-Mapped Database (LMDB))
  • mdbはチューニング不要 ※DB_CONFIGはbdbの設定ファイル
  • デフォルトのOLCのディレクトリツリーは以下の通り。
ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config 2>/dev/null | grep "^dn"
dn: cn=config
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}monitor,cn=config
dn: olcDatabase={2}mdb,cn=config

f:id:pikesaku:20211120124238p:plain

セットアップ手順

①インストール

dnf install openldap-clients openldap-servers

②サービス起動

systemctl start slapd

③設定ディレクトリバックアップ

rsync -a /etc/openldap/slapd.d /etc/openldap/slapd.d_org

スキーマ追加

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

※必要に応じて追加
※以下で確認可能

ls /etc/openldap/slapd.d/cn\=config/cn\=schema/
cn={0}core.ldif  cn={1}cosine.ldif  cn={2}inetorgperson.ldif

⑤動的設定ディレクトリ設定

cat > ./config <<HERE
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=config
-
add: olcRootPW
olcRootPW: {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
HERE
ldapadd -Y EXTERNAL -H ldapi:// -f ./config

※olcRootPWの値は、slappasswdで事前に生成した文字列を設定する。

⑥monitorディレクトリ設定

cat > ./monitor <<HERE
dn: olcDatabase={1}monitor,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=monitor
-
add: olcRootPW
olcRootPW: {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-
replace: olcAccess
olcAccess: to *
  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
  by * none
HERE
ldapadd -Y EXTERNAL -H ldapi:// -f ./monitor

mdbディレクトリ設定

cat > ./mdb <<HERE
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=hoge,dc=com
-
replace: olcRootDN
olcRootDN: cn=Manager,dc=hoge,dc=com
-
add: olcRootPW
olcRootPW: {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-
add: olcDbIndex
olcDbIndex: uid eq
olcDbIndex: entryCSN,entryUUID eq
-
replace: olcAccess
olcAccess: to *
  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
  by * none
HERE
ldapadd -Y EXTERNAL -H ldapi:// -f ./mdb

ドメインやインデックスは環境に応じて変更する。

Syslog出力設定 & ログローテート

local4.*を指定ログファイルへ
ログローテート対象にログファイル追加

IPv6無効化

slapd起動オプションで-4を指定。(/etc/sysconfig/slapdがないので、serviceファイル直接修正しかない???)

Configuration Backendへの移行

RHEL6→RHEL8へのOpenLDAPのマイグレ作業時の考察

[前提]
RHEL6でConfiguration Backendを使わず、slapd.confで設定管理してた場合。方法は3つある。

①slapd.confの設定内容を、Configuration Backendのldifに置き換えて設定を入れる。

→LDIF慣れてないと大変。

②slapd.conf→Configuration Backendへの設定移行をslaptestでやる。
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
③Configuration Backendを使わず、slapd.confで管理する。

/etc/openldap/slapd.dを削除して、/etc/openldap/slapd.confだけにすればOK
ただ、updateした時、/etc/openldap/slapd.d配下のファイルが作られてしまい、そっちが有効になってしまうかも。しかも、obsoleteでいずれ使えなくなる。

上記より②が妥当だが注意が必要。

バックエンドDBは、RHEL8ではdbdでなくmdbがデフォルトである点

slaptest実行前に、RHEL6から持ってきたslapd.confのdatabaseをmdbに変更する。
あと、bdb関連パラメタを削除する。checkpoint等。

slaptestコマンドがエラー終了する点

slaptestコマンド実行時にslapd.confで定義されたドメインのデータベースのファイルを/var/lib/ldapに探しに行ってエラーになる。

mdb_db_open: database "dc=hoge,dc=com" cannot be opened: No such file or directory (2). Restore from backup!
backend_startup_one (type=mdb, suffix="hoge,dc=com"): bi_db_open failed! (2)
slap_startup failed (test would succeed using the -u switch)

エラーになっても、slapd.d配下にファイルは生成されており、正常にコンフィグ移行できてそう。ただエラーは気になる。
slapdを起動させれば、DBが生成されるので、以下でやれば、slaptestがエラーにならなくなる。
slaptest実行→エラー発生→slapd起動→slapd停止→slaptest再度実行→正常終了する

RHEL6のslapd.confでdatabase configをコメントアウトしてたら有効にする!これではまった。。。。。
slaptestコマンドでslapd.d配下にファイルが生成されるが、コマンド実行ユーザーがオーナーになる点。

chown -R ldap. /etc/openldap/slapd.d
をやる必要あり。slapaddと同じ。

RHEL8のcrypto-policiesについて

やったこと

opensshからmacでumac-128を無効にする。

やりかた

/etc/crypto-policies/policies/modules
ここに
CUSTOM-MAC.pmod
ファイルを作る。

このファイルの中身は
mac = -UMAC-128

で、以下コマンドで設定
update-crypto-policies --set DEFAULT:CUSTOM-MAC

※デフォルトポリシーがDEFAULTの前提

参考情報

man 8 update-crypto-policies
man 7 crypto-policies
 Crypto Policy Definition Format セクション
/usr/share/crypto-policies/policies/DEFAULT.pol
 指定可能なキー、パラメタが分かる。

RHEL8のシステム全体の暗号化ポリシー機能について

メモ

  • これいいかも。
  • 関連コマンド
$ update-crypto-policies --show
DEFAULT
# update-crypto-policies --set FUTURE
Setting system policy to FUTURE

RHEL8起動時エラー

無視して良い

kernel: pci 0000:00:XX.X: BAR 13: failed to assign [io  size 0xXXXXX]

Document Display | HPE Support Center

augenrules[XXX]: failure 1

起動中にメッセージ「augenrules: failure 1」が記録される - Red Hat Customer Portal

一応対処する

dbus-daemon[XXX]: [system] Activation via systemd failed for unit 'dbus-org.freedesktop.resolve1.service': Unit dbus-org.freedesktop.resolve1.service not found.

The "Activation via systemd failed for unit 'dbus-org.freedesktop.resolve1.service': Unit dbus-org.freedesktop.resolve1.service not found" messages in /var/log/messages. - Red Hat Customer Portal

原因はNetworkManager.serviceが起動時に、systemd-resolved.serviceの機能を利用するが、systemd-resolved.serviceが起動してない為。
最小インスト構成で発生するエラーなので無視してもOKだろう。
対処は、以下2通り
・systemd-resolvedサービスの自動起動を有効化する。
・NetworkManager.serviceが起動時にsystemd-resolved.serviceを利用しないように設定変更する。

不要なサービスは起動させないが、良いと思うので後者の対処をする。

/etc/NetworkManager/NetworkManager.conf
のmainセクションにsystemd-resolved=falseを追記

[main]
systemd-resolved=false

RHEL8で無効にするサービスについて

最小インストの構成で自動起動が有効なサービスの内、無効にするもの

サービス 説明
import-state.service ネットワークストレージからの起動時に必要
kdump.service カーネルクラッシュからのレポートが必要な場合に必要
NetworkManager-wait-online.service システム起動時にNW接続が有効になるまでwaiする。起動遅くなる。
nis-domainname.service NISサーバ機能
selinux-autorelabel-mark.service SELinuxを利用する場合に必要
sssd.service LDAP等NW経由でログインする場合に必要
unbound-anchor.timer DNSSECのルートトラストアンカーを毎日更新する場合に必要

サービス詳細確認

systemctl cat <service_name>
systemctl help <service_name>

無効化コマンド

systemctl disable import-state.service kdump.service NetworkManager-wait-online.service nis-domainname.service  selinux-autorelabel-mark.service sssd.service unbound-anchor.timer

firewalldについて

firewalld把握の大事なところ!!!

# firewall-cmd --list-all
  public (active)
  target: default ★
  icmp-block-inversion: no
  interfaces: eth0 ★
  sources:  ★
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
# 

target、interfaces、sourcesがポイント

ポイント

ゾーン未定義のNICには、デフォルトゾーンが適用される
targetのdefaultとREJECTは似てるが、ICMP応答有無が異なる。(defaultは応答)
アクティブなゾーンは、interfaces or sourcesが割り当てられたゾーン
sourcesが割り当てられたゾーンはアクティブだが、rich rules or servicesが登録されてないと動作しない
sourcesが割り当てられたゾーンがインターフェースが割り当てられたゾーンよりも優先的に処理される(ホワイトリスト的な扱い)

f:id:pikesaku:20211017175105p:plain

rich ruleの書式は以下で確認

$ man firewalld.richlanguage