2.7K Views
March 05, 24
スライド概要
Red Hat Identity Management (FreeIPA)の構築でハマった点を話します。
RHEL と Windows の統合認証基盤について Identity Management(IdM)/FreeIPA System Security Servies Daemon AcitiveDirectory との統合認証基盤を目指して @nlog2n2 Sekiguchi Toshihiro
経緯
経緯 皆さん、WindowsとLinuxの認証を統合したら、みんなハッピーになると想像 したことありますよね!!ということで、やってみましょう。 RHEL には Windows の ActiveDirectory と連携する認証基盤として Identity Manager(FreeIPA) という製品が公式であります。 今回はSSH公開鍵認証方式で、認証基盤が動くか確認してきましょう😆
技術要素の説明
FreeIPA(IdM)/SSSD とは FreeIPAを元に Identity Management という名前になって、RHEL 6 に同梱 されることになった。Linux の認証周りの設定を色々やってくれる。 FreeIPAの派生で SSSD が生まれたけど、SSSDの方が有名かもしれない。
FreeIPA(IdM)/SSSD とは https://www.freeipa.org/About.html
FreeIPA(IdM)/SSSD とは FreeIPA(IdM)は Linux, 389 Directory Server、MIT keroberos、 NTP、DNS、Dogtagを組み合わせたセキュリティ情報管理ツールで、一元的 な認証、認可、およびアカウント情報を提供します。
ActiveDirectory https://learn.microsoft.com/ja-jp/windows-server/identity/ad-ds/ get-started/virtual-dc/active-directory-domain-services-overview
Tips
残念なお知らせと嬉しいお知らせ • 残念なお知らせ • OpenLDAP は使えなくなり、代わりに 389 Directory Server が LDAPの機能を提供します。 • 嬉しいお知らせ • 389 Directory Server のサービスは Windows の ActiveDirectory と連携が取れます。 • 2要素認証も対応している。使ったら幸せになれそう。 • ActiveDirectory がやる作業を IdMでやると ActiveDirecotry の負荷が下がり、同時に認証できる ユーザー数が増える。
認証のパターン
認証のパターン • ADのLDAPにクラスと属性を追加して公開鍵を追加する • ADとFreeIPA(IdM)を連携させ、FreeIPAにSSH公開鍵の認証を委任する
認証のパターン • ADのLDAPにクラスと属性を追加して公開鍵を追加する • ADとFreeIPA(IdM)を連携させ、FreeIPAにSSH公開鍵の認証を委任する
検証環境の構成
検証環境の構成図 秘密鍵 ad.eval.example.com idm.eval.example.com 公開鍵 sssd.eval.example.com
検証環境の構成図 秘密鍵 ad.eval.example.com idm.eval.example.com 公開鍵 sssd.eval.example.com
検証環境の構成図 秘密鍵 ad.eval.example.com idm.eval.example.com 公開鍵 sssd.eval.example.com
AD,DNS サーバ構築
ADの構築 ADの構築は割愛 サーバーマネージャーから「管理と機能の追加」を実施する ActiveDirecotry ドメインサービス、DNSサーバーを選択する インストール完了
DNSサーバの構築 ゾーンとAレコードを登録する PTRレコードを登録する
DNSサーバの構築 DNSフォワーダーの設定がされていることを確認する
Tips
Windows11のターミナルの透過 • Windows11 はターミナルというものを利用 すると、TeratermやPuttyを入れなくても SSHができる。 • なんとなく透過したかったので、調べると、 ターミナルを開いて ctrl +, を入れると設定 が画面が開く。 • 以下の内容を json に記載することで、ター ミナルを透過できる。 "defaults": { "opacity": 80, "useAcrylic": false },
FreeIPAの構築
この辺を参考にする
FreeIPA のインストールパターン 1. 統合 DNS と統合 CA を root CA として使用する場合 2. 統合 DNS と外部 CA を root CA として使用する場合 3. 統合 DNS があり外部 CA がない場合 4. 統合 DNS がなく統合 CA が root CA としてある場合 5. 統合 DNS なしで外部 CA を root CA として使用する場合
FreeIPA のインストールパターン 🤔
FreeIPA のインストールパターン 公式の説明が、 よくわからないので整理する
FreeIPA のインストールパターン
FreeIPA のインストールパターン 統合DNSというのは、おそらく、IdMについてくるDNSのことを指している 統合CAというののは、おそらく、IdMについてくるCA機能のことを指している
FreeIPA のインストールパターン
インストール作業
FreeIPAの構築 • 日本語設定から英語の設定に変更する • lcalectl • sudo dnf instal glibc-langpack-en • locale -a • sudo localectl set-locale LANG=en̲US.utf8
FreeIPAの構築 • 日本語設定から英語の設定に変更する • lcalectl • sudo dnf instal glibc-langpack-en 【重要】日本語の設定でインストールすると失敗します。 • locale -a • sudo localectl set-locale LANG=en̲US.utf8
FreeIPAの構築 • freeIPA のパッケージをインストール • sudo dnf install ipa-server -y https://docs.oracle.com/ja/learn/ol-freeipa/index.html#install-the-required-packages
IdMの構築 • DNSサーバーの設定(syscon g がない...だと... • nmcli connection modify enp0s8 ipv4.dns 10.0.2.10 • nmcli connection reload • systemctl restart NetworkManager fi https://docs.oracle.com/ja/learn/ol-freeipa/index.html#install-the-required-packages
IdMの構築 • DNSサーバーの設定(syscon g がない...だと... • nmcli connection modify enp0s8 ipv4.dns 10.0.2.10 【重要】認証に関係するサーバーのFQDNが解決できないと認証に失敗します • nmcli connection reload • systemctl restart NetworkManager fi https://docs.oracle.com/ja/learn/ol-freeipa/index.html#install-the-required-packages
インストール開始 対話式のインストール方式が、マニュアルの先頭に書かれています。しかし、罠が多すぎるので、お勧めし ません。特にDNSフォワーダーを設定するか問われますが、FreeIPAのDNSを利用しない場合は不要で す。非対話式のインストールコマンドは以下の通りです。 • サンプル:ipa-server-install --realm IDM.EXAMPLE.COM --ds-password DM̲password -admin-password admin̲password --unattended • RHEL(IdM)でも同じコマンドでインストールします。
インストール開始 --ds-password は AD のスーパーユーザーである Direcotry Manger のパスワード、--admin-password は IdM 管理者(admin)に設定したいパスワードを入力する。realm は参加するドメインを指定する。 インストールにしばらく時間がかかるので、スプラトゥーンのガチマッチ2戦ぐらいやって待つ。 • export DM̲password='CukA>@vg̲8' • export admin̲password='CukA>@vg̲8' • ipa-server-install --realm eval.example.com --ds-password $DM̲password --admin-password $admin̲password --unattended
インストール時の様子
• systemctl status rewalld.service • systemctl start rewalld.service • systemctl enable rewalld.service • rewall-cmd --permanent --add-service={freeipa-4,dns} • rewall-cmd --reload • rewall-cmd --runtime-to-permanent fi rewall-cmd --permanent --add-port={80/tcp,443/tcp,389/tcp,636/tcp,88/tcp,88/udp,464/tcp,464/udp,53/tcp,53/udp} fi • fi fi fi fi fi Firewallの解放作業
WebUIにアクセス&ログイン
利用している内部DNSにレコードを登録しないといけないらしい fi Please add records in this le to your DNS system: /tmp/ipa.system.records.otdheee̲.db
とりあえずファイルを見てみるか [root@idm ~]# cat /tmp/ipa.system.records.otdheee_.db _kerberos-master._tcp.eval.example.com. 3600 IN SRV 0 100 88 idm.eval.example.com. _kerberos-master._udp.eval.example.com. 3600 IN SRV 0 100 88 idm.eval.example.com. _kerberos._tcp.eval.example.com. 3600 IN SRV 0 100 88 idm.eval.example.com. _kerberos._udp.eval.example.com. 3600 IN SRV 0 100 88 idm.eval.example.com. _kerberos.eval.example.com. 3600 IN TXT "EVAL.EXAMPLE.COM" _kerberos.eval.example.com. 3600 IN URI 0 100 "krb5srv:m:tcp:idm.eval.example.com." _kerberos.eval.example.com. 3600 IN URI 0 100 "krb5srv:m:udp:idm.eval.example.com." _kpasswd._tcp.eval.example.com. 3600 IN SRV 0 100 464 idm.eval.example.com. _kpasswd._udp.eval.example.com. 3600 IN SRV 0 100 464 idm.eval.example.com. _kpasswd.eval.example.com. 3600 IN URI 0 100 "krb5srv:m:tcp:idm.eval.example.com." _kpasswd.eval.example.com. 3600 IN URI 0 100 "krb5srv:m:udp:idm.eval.example.com." _ldap._tcp.eval.example.com. 3600 IN SRV 0 100 389 idm.eval.example.com. ipa-ca.eval.example.com. 3600 IN A 10.0.2.101 ipa-ca.eval.example.com. 3600 IN A 192.168.56.101 [root@idm ~]#
DNSレコードの登録? 😇 WindowsServer にこれらの DNS レコードが登録できないと即死亡
まずレコード種類ごとにソート
[root@idm ~]# cat /tmp/ipa.system.records.otdheee_.db | awk '{print $4 " " $0}' | sort | uniq
A ipa-ca.eval.example.com. 3600 IN A 10.0.2.101
A ipa-ca.eval.example.com. 3600 IN A 192.168.56.101
SRV _kerberos-master._tcp.eval.example.com. 3600 IN SRV 0 100 88 idm.eval.example.com.
SRV _kerberos-master._udp.eval.example.com. 3600 IN SRV 0 100 88 idm.eval.example.com.
SRV _kerberos._tcp.eval.example.com. 3600 IN SRV 0 100 88 idm.eval.example.com.
SRV _kerberos._udp.eval.example.com. 3600 IN SRV 0 100 88 idm.eval.example.com.
SRV _kpasswd._tcp.eval.example.com. 3600 IN SRV 0 100 464 idm.eval.example.com.
SRV _kpasswd._udp.eval.example.com. 3600 IN SRV 0 100 464 idm.eval.example.com.
SRV _ldap._tcp.eval.example.com. 3600 IN SRV 0 100 389 idm.eval.example.com.
TXT _kerberos.eval.example.com. 3600 IN TXT "EVAL.EXAMPLE.COM"
URI _kerberos.eval.example.com. 3600 IN URI 0 100 "krb5srv:m:tcp:idm.eval.example.com."
URI _kerberos.eval.example.com. 3600 IN URI 0 100 "krb5srv:m:udp:idm.eval.example.com."
URI _kpasswd.eval.example.com. 3600 IN URI 0 100 "krb5srv:m:tcp:idm.eval.example.com."
URI _kpasswd.eval.example.com. 3600 IN URI 0 100 "krb5srv:m:udp:idm.eval.example.com."
[root@idm ~]#
登録するレコードの種類 • • • • A レコードわかる SRV レコードわかる TXT レコードわかる URI レコードってなんですか(#^ω^)
What is URI Record ? 🤮
最後まで分からない... The Uniform Resource Identi er (URI) DNS Resource Record Abstract This document describes the already registered DNS resource record (RR) type, called the Uniform Resource Identi er (URI) RR, that is used for publishing mappings from hostnames to URIs. ホスト名からURIへマッピングへ利用するレコードとのことらしいですが、 本当によくわからない。 fi fi https://datatracker.ietf.org/doc/html/rfc7553
最後まで分からない... • Bingで検索すると私が書いたQiitaの 記事が3番目にくるぐらいには謎
最後まで分からない... • Googleで検索すると私が書いたQiita の記事が3番目にくるぐらいには謎
Powershellでレコードを登録する •サンプル •Add-DnsServerResourceRecordA -Name "host23" -ZoneName "contoso.com" -AllowUpdateAny -IPv4Address "172.18.99.23" •Add-DnsServerResourceRecord -Srv -Name "sip" -ZoneName "contoso.com" -DomainName "sipserver1.contoso.com" -Priority 0 -Weight 0 -Port 5060 •Add-DnsServerResourceRecord -DescriptiveText "$dkim2_part1" -Name sea2048._domainkey -Txt -ZoneName $domain -TimeToLive 0:1:00:00 とありましたが、 Add-DnsServerResourceRecordA だと TTL がパラメータとして受け付けてくれないみたいなので、 •Add-DnsServerResourceRecord -A で登録する。
URIレコードの登録 • RHEL の issue ページに以下のような記述がありました。 • 表示された内容の一部に対して named-rrchecker で詰め込めたいデータ を表示させるといいよ!! • Powershellだと -Type 256 と入力すればいいよ!!
named-rrcheckr 実行 echo 'IN URI 0 100 "krb5srv:m:tcp:idm.eval.example.com."' | named-rrchecker -u echo 'IN URI 0 100 "krb5srv:m:udp:idm.eval.example.com."' | named-rrchecker -u を実行して、実際に打ち込んだコマンドがこちら。 Add-DnsServerResourceRecord -ZoneName "eval.example.com" -Name "_kerberos" -Type 256 -RecordData "000000646B7262357372763A6D3A7463703A69646D2E6576616C2E6578616D706C652E636F6D2E" -TimeToLive 01:00:00 Add-DnsServerResourceRecord -ZoneName "eval.example.com" -Name "_kerberos" -Type 256 -RecordData "000000646B7262357372763A6D3A7564703A69646D2E6576616C2E6578616D706C652E636F6D2E" -TimeToLive 01:00:00 Add-DnsServerResourceRecord -ZoneName "eval.example.com" -Name "_kpasswd" -Type 256 -RecordData "000000646B7262357372763A6D3A7463703A69646D2E6576616C2E6578616D706C652E636F6D2E" -TimeToLive 01:00:00 Add-DnsServerResourceRecord -ZoneName "eval.example.com" -Name "_kpasswd" -Type 256 -RecordData "000000646B7262357372763A6D3A7564703A69646D2E6576616C2E6578616D706C652E636F6D2E" -TimeToLive 01:00:00
DNSレコードの登録? 😇 WindowsServer に DNS レコードが登録する作業で死にかける
Powershellのコマンド
登録したURIレコード
レコードの確認
インストール 作業完了
ハマった点の総括
ハマった点まとめ • インストールの場合分けが良くわからなかった。 • 統合DNS、統合CAという用語が最後までよくわからなかった。 • LANGの設定をUSにしないといけない。 • インストール時にDNSフォワーダーの設定を聞かれるが、統合DNSを利用し ない限り不要な設定だった。 • Windows Server の DNS 登録作業でやることが多すぎた。
インフラとして整備しなければいけないこと • Keroberos認証を行うために、ログインするサーバーは FQDN を解決すること、NTPが同期していな ければいけないこと。/etc/hosts では対応不可。 • SSSD を使った認証はキャッシュが残るので運用でユーザーの削除作業のタイミングを決める必要があ る。 • ActiveDirectoryでユーザーを管理するが、SSH 公開鍵の登録は IdM の画面または CLI コマンドで IdM のユーザー情報を上書きする必要がある。 • 単純に Windows と RHEL で二重管理になるため、管理工数が増大する。 • 上記のサーバー以外に NTP, DNS サーバーの運用工数が必要になる。
結論 WindowsのActiveDirectoryでSSHの公開鍵認証させるのは、運用工数および システム構成的に人類には早すぎるため、WindowsとLinuxの認証基盤は分け ましょう。
怖い話
インフラとして整備しなければいけないこと これは認証側の基盤の構築で、 認証の設定工数抜きなんですよね😇
参考 • FreeIPAの紹介 • https://www.slideshare.net/moriwaka/freeipa20171129