FreeIPAサーバーを4.6.8から4.9.6へ移行する

移行元

・ ディストリビューション: CentOS 7.9
・ ホスト名: ipa1.local.example.com
・ IPアドレス: 192.168.0.10
・ IPAサーバー: 4.6.8

移行先

・ ディストリビューション: AlmaLinux 8.5
・ ホスト名: newipa1.local.example.com
・ IPアドレス: 192.168.0.20
・ IPAサーバー: 4.9.6

重要な留意事項

移行先の4.9.6にはca設定を含むレプリカが作成できない不具合があるため、試した限り移行元から移行先へのレプリカ作成は一度しか実行できない。一度でも4.9.6でレプリカを作成した場合、それ以降は4.6.8のca設定を含むレプリカを4.9.6で作成できなくなった。

4.9.6への移行を実行する際に注意すること

この作業手順でca設定などが消失しても運営者は一切責任とりません

・移行元のバックアップを作成してから実行する
・移行先のFQDNは本番プライマリサーバーと同一にする

移行元と移行先のFQDNが同一の場合

4.9.6のレプリカ作成前なら4.6.8同士のレプリカを作成できるので、それを利用して4.6.8のレプリカを作成し、プライマリに変更して移行元とする。
参考ページ: dna範囲の確認方法

① 一時的に移行元と同じ4.6.8でcaを含むバックアップ用のレプリカを作成する
② IdMのWebUIなどで「IPA CA renewal master」をバックアップ用のレプリカに変更する
③ 移行元のdna範囲を控える
④ 移行先と同じFQDNのIPAサーバーを削除する
⑤ さっきの記事を参考に控えたdna範囲をバックアップ用のレプリカにセットする

移行元(CentOS 7.9)での作業

移行元でファイアウォールを無効化しておく。使用しているポートが違うのか例外設定していても失敗する。

# systemctl stop firewalld

移行元のIdMにWEBブラウザでアクセスして、移行先のhostを追加する。

移行先(AlmaLinux 8.5)での作業

移行先のホスト名をFQDNに変更する。

# hostnamectl set-hostname newipa1.local.example.com

参照するDNSサーバーを移行元IPAサーバーにする。

# nmcli connection modify コネクション名 ipv4.dns 192.168.0.10
# nmcli connection up コネクション名

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

# dnf install @idm:DL1
# dnf install ipa-server ipa-server-dns

IPAクライアントとして設定する。

# ipa-client-install

初回ログイン時にホームディレクトリを自動生成するよう設定する。

# authconfig --enablemkhomedir --update

ファイアウォールの例外を登録する。

# firewall-cmd --permanent --add-service={freeipa-ldap,freeipa-ldaps,freeipa-replication,dns,ntp,http,https}
# firewall-cmd --reload

ca設定を含むレプリカを作成する。
※DNSとしても動作させるため「–setup-dns」オプション指定

# ipa-replica-install --setup-ca --setup-dns --forwarder <forwarderのIPアドレス1> --forwarder <forwarderのIPアドレス2>

参照するDNSサーバーを自身にする。

# nmcli connection modify コネクション名 ipv4.dns 192.168.0.20
# nmcli connection up コネクション名

「IPA CA renewal master」を移行先に変更する。

# kinit admin
# ipa config-mod --ca-renewal-master-server newipa1.local.example.com

移行元のdna範囲を確認する。
※必要に応じて予め「kinit admin」で認証する

# ipa-replica-manage dnarange-show

確認した移行元のdna範囲を移行先にセットする。
※必要に応じて予め「kinit admin」で認証する

# ipa-replica-manage dnarange-set newipa1.local.example.com 1304400077-1304599999

AlmaLinux8でIPAユーザー認証できるsambaファイルサーバーの設定

環境

ここの手順で構築したIPAサーバーで認証する。

・ AlmaLinuxのバージョン: 8.5
・ ホスト名: samba.local.example.com
・ IPアドレス: 192.168.0.12
・ sambaのバージョン: 4.14.5
・ ipa-clientのバージョン: 4.9.6

IPAサーバーでの作業手順

IPAサーバーのIdMにWEBブラウザでアクセスして、ホスト「samba.local.example.com」をIPアドレス「192.168.0.12」で追加する。

IPAサーバーでsambaからの認証要求を処理するために必要なパッケージをインストールする。

# dnf install ipa-server-trust-ad

下記コマンドを実行してsambaを信頼設定する。

# ipa-adtrust-install

ファイアウォールに例外を登録する。

# firewall-cmd --permanent --add-service=freeipa-trust
# firewall-cmd --reload

IPAサーバーを再起動する。

# ipactl restart

※セカンダリIPAサーバーでもsambaからの認証要求を処理したい場合は同様の設定手順をセカンダリでも行う必要がある

Sambaサーバーでの作業手順

FQDNでホスト名を設定する。

# hostnamectl set-hostname samba.local.example.com

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

# dnf install ipa-client-samba

IPAクライアントとして設定する。

# ipa-client-install

共有ディレクトリを作成する。
※root以外がアクセスできないようにする

# mkdir -p /var/samba/share
# chmod 770 /var/samba/share

samba構成ユーティリティを実行して初期設定する。

# ipa-client-samba

初期設定されたsambaの設定ファイルを編集して最下行に追記する。
※「force user」にrootを指定してファイル操作をrootで実行させる

[share]
path = /var/samba/share
create mask = 0660
directory mask = 0770
force user = root
writable = yes
valid users = @testgroup

ファイアウォールに例外を登録する。

# firewall-cmd --permanent --add-service=samba
# firewall-cmd --reload

SELinuxのラベル付けを行う。

# semanage fcontext -a -t samba_share_t "/var/samba/share(/.*)?"
# restorecon -RF /var/samba/share/

SELinuxにsmbdによるパブリックディレクトリへの書き込みを有効にする。

# setsebool -P allow_smbd_anon_write true

サービスを有効にして起動する。

# systemctl enable --now smb
# systemctl enable --now winbind

AlmaLinux8でのFreeIPAサーバーの設定

前提条件

・ AlmaLinuxのバージョン: 8.5
・ ipaサーバーのバージョン: 4.9.6
・ プライマリのIPアドレスは192.168.0.10
・ セカンダリのIPアドレスは192.168.0.11

プライマリサーバーの設定

FQDNでホスト名を設定する。
※FQDNが192.168.0.10に名前解決できるようにしておく

# hostnamectl set-hostname ipa1.local.example.com

モジュールを検索して必要そうなものを特定する。

$ dnf module list

idmのDL1にServerと書いてあったので、それをインストールする。

# dnf install @idm:DL1

モジュールのインストールが完了したら、必要なパッケージをインストールする。

# dnf install ipa-server ipa-server-dns

対話型のインストーラーを起動する。
※同時にbindも設定してもらう
※DNSフォワーダーも設定する
※そのほかは大体Enterで続行した

# ipa-server-install

ファイアウォールの例外を登録するよう促されるので登録する。
※サービス名で設定する場合は「ldap」ではなく「freeipa-ldap」なので注意
※freeipa-replicationはセカンダリを構築しない場合はいらない

# firewall-cmd --permanent --add-service={freeipa-ldap,freeipa-ldaps,freeipa-replication,dns,ntp,http,https}
# firewall-cmd --reload

参照するDNSサーバーを自身にする。

# nmcli connection modify コネクション名 ipv4.dns 192.168.0.10
# nmcli connection up コネクション名

chronyのserver/clientの設定をする。
※変更箇所のみ記載

# Allow NTP client access from local network.
#allow 192.168.0.0/16
allow 192.168.0.0/24

# Select which information is logged.
#log measurements statistics tracking
server ntp.nict.jp iburst

chronydを再起動する。

# systemctl restart chronyd

初回ログイン時にホームディレクトリを自動生成するよう設定する。

# authconfig --enablemkhomedir --update

セカンダリサーバーの設定

プライマリのIdMにWEBブラウザでアクセスして、セカンダリのhostを追加する。

セカンダリのホスト名をFQDNに変更する。

# hostnamectl set-hostname ipa2.local.example.com

参照するDNSサーバーをプライマリIPAサーバーにする。

# nmcli connection modify コネクション名 ipv4.dns 192.168.0.10
# nmcli connection up コネクション名

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

# dnf install @idm:DL1
# dnf install ipa-server ipa-server-dns

IPAクライアントとして設定する。

# ipa-client-install

chronyのserver/clientの設定をする。
※変更箇所のみ記載

# Allow NTP client access from local network.
#allow 192.168.0.0/16
allow 192.168.0.0/24

# Select which information is logged.
#log measurements statistics tracking
server ntp.nict.jp iburst

chronydを再起動する。

# systemctl restart chronyd

初回ログイン時にホームディレクトリを自動生成するよう設定する。

# authconfig --enablemkhomedir --update

ファイアウォールの例外を登録する。

# firewall-cmd --permanent --add-service={freeipa-ldap,freeipa-ldaps,freeipa-replication,dns,ntp,http,https}
# firewall-cmd --reload

レプリカインストールを実行する。なぜか「–setup-ca」オプションをつけると必ず失敗する。ほかのディストリビューション(Rocky Linux、Oracle Linux)で試してみたり、色々な小細工してみたけど解決できなかったので、今回はCA設定をプライマリだけで運用することにした。
※DNSとしても動作させるため「–setup-dns」オプション指定

# ipa-replica-install --setup-dns --forwarder <forwarderのIPアドレス1> --forwarder <forwarderのIPアドレス2>

参照するDNSサーバーを自身にする。

# nmcli connection modify コネクション名 ipv4.dns 192.168.0.11
# nmcli connection up コネクション名

補足

プライマリのCA設定がレプリケーションできていないため定期的にバックアップを取得する必要がある。下記のコマンドでバックアップを作成できるが、作成場所は指定できず/var/lib/ipa/backup/に「ipa-full-2022-04-09-14-28-16」という形でディレクトリが作成される。cronで実行する場合は適宜スクリプトを書いた方が良い。

# ipa-backup

対してリストアはバックアップファイルへのパスを指定して実行する。

# ipa-restore /var/lib/ipa/backup/ipa-full-2022-04-09-14-28-16/

FreeIPAサーバーのdna範囲を再セットする

前提条件

FreeIPAのバージョンは4.6.8、一時的に普通のPCでipa98/ipa99というFreeIPAサーバーを立てて、移行作業後に本番で使うサーバー機でipa01/ipa02をレプリカにして、何も考えずにマルチマスターだからと思って、最初に作ったipa98/ipa99をIdMで削除して、しばらく認証されてるから良いと思ってたら新しいユーザー追加できなかった際の対応内容です。下記のエラーが発生しました。
Allocation of a new value for range cn=posix ids,cn=distributed numeric assignment plugin,cn=plugins,cn=config failed! Unable to proceed.

対応内容

現在のipa01とipa02のdna範囲を確認する。

# kinit admin
# ipa-replica-manage dnarange-show

dna範囲が設定されていなかった。

ipa01.local.example.com: No range set
ipa02.local.example.com: No range set

dnarange-setで設定できそうだけど、設定する範囲を知りたいので、消してしまったサーバーの残っていた設定ファイルをfindとgrepで探索してたら、それっぽいファイルを発見した。IdMと見比べても矛盾していなさそう。

…
dnaMaxValue: 1304599999
dnaNextValue: 1304400063
…

下記のコマンドでdnaを範囲を設定したら無事にユーザーを追加できた。

# ipa-replica-manage dnarange-set ipa01.local.example.com 1304400063-1304599999

Windows10にすべてのFreeIPAユーザーと同名のローカルユーザーを作成する

前提条件

この手順で設定したIPAサーバー、この手順で設定したWindows10を使用する。

・ IPAサーバーではexpectコマンドをインストール済み
・ Windows10には設定からsshdをインストール済み

スクリプトの流れ

① FreeIPAサーバーですべてのIPAユーザーを取得してカンマ区切りに加工する
② expectコマンドを使用してWindowsにsshで接続する
③ Windows上でユーザーの追加を行うスクリプトに「①」で取得したユーザーリストを送信する

IPAサーバーのスクリプト

cronで定期的に実行するとWindowsの管理が少し楽になるかもしれない。
Windowsの台数が多い場合はsamba4のActiveDirectory使ったほうが良い。

#!/bin/bash

# Kerberosユーザーをすべて取得する
# IPAユーザー以外でログインしている場合はkinitが必要
# echo 'password' | kinit admin
USERS=`ipa user-find | grep "User login:*" | sed "s/  User login: //g" | sed -z "s/\n/,/g"`

# Windowsクライアントにsshで接続して専用batファイルを実行する
# WindowsのIPアドレスは192.168.0.100
# Administratorのパスワードは12345678
HOST="192.168.0.100"
expect -c "
	spawn ssh administrator@$HOST
	expect \"password:\"
	send 12345678\\n
	expect \"Microsoft Windows\"
	send \"C:\\\\Script\\\\UpdateUserAccounts.bat \\\"$USERS\\\"\r\n\"
	expect \"ユーザーリストの更新が完了しました。\"
	send exit\r\n
	interact
"

Windows10のスクリプト

ここではローカルにスクリプト置いてるけど、samba共有に置いた方が管理しやすいかも。

:# ※引数として渡されるユーザーリストはカンマ区切りで末尾にもカンマが必要
@echo off
set parameters=%~1
set domain=LOCAL.EXAMPLE.COM

setlocal enabledelayedexpansion

:# 引数で渡されたリストでローカルにいないユーザーの作成
:# パスワードは実際のサインインには使用されないので固定値
:# パスワードの有効期限を無期限にする
:# 「Remote Desktop Users」グループに所属させる
set password=87654321
for %%P in (%parameters%) do (
	net user %%P 1>NUL 2>NUL
	if ERRORLEVEL == 1 (
		net user %%P %password% /add /expires:never /fullname:%%P@%domain% 1>NUL
		wmic useraccount where "Name='%%P'" set PasswordExpires=FALSE 1>NUL
		net localgroup "Remote Desktop Users" %%P /add 1>NUL
	)
)

endlocal

echo ユーザーリストの更新が完了しました。

Windows10にkerberos認証でサインインする

前提条件

・ Homeエディション
・ クライアントFQDNはwin01.local.example.com
・ クライアントのhostをKDC上で作成しておく
・ クライアントのkeytabを任意のパスワードで生成しておく
  (FreeIPAなら ipa-getkeytab -s dc1.local.example.com -p host/win01.local.example.com -k /etc/krb5.win01.keytab -P など)

PC名の変更

はじめにPC名をwin01にしておく。

認証サーバーの設定

コマンドプロンプトを管理者として起動し下記コマンドを実行する。

ksetup /setdomain LOCAL.EXAMPLE.COM
ksetup /setcomputerpassword keytab生成時に指定したパスワード
ksetup /addkdc LOCAL.EXAMPLE.COM dc1.local.example.com
ksetup /addkpasswd LOCAL.EXAMPLE.COM dc1.local.example.com
ksetup /mapuser * *

再起動と確認

Windowsを再起動して、フルコンピュータ名がwin01.local.example.comのようなFQDNになっていることを確認する。

暗号化の種類を構成

レジストリを編集して、Kerberosで許可する暗号化の種類を構成する。
RC4_HMAC_MD5・AES128_HMAC_SHA1・AES256_HMAC_SHA1を有効にするのが目的。
※gpedit.mscが使えるならGUIで設定しても良い

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parameters]
"SupportedEncryptionTypes"=dword:0000001c

ローカルアカウントの作成

kerberos認証でサインインするユーザーと同名のローカルアカウントを作成する。
※実際の認証には使われないがパスワードは管理者側で何か設定した方が良い

実際のサインイン

サインインする際は「user@LOCAL.EXAMPLE.COM」のようにrealmをつけて行う。

Ubuntu18.04をIPAクライアントとして設定する

前提条件

この手順で設定したIPAサーバーを使用する
・IPAサーバーのIdMにWEBブラウザなどでクライアントhostを作成しておく

ホスト名をFQDNにする。

# hostnamectl set-hostname client01.local.example.com

FQDNでの名前解決をできるようにしておく。

127.0.0.1    client01.local.example.com

必要なパッケージのインストール。

# apt install freeipa-client

対話型のインストーラーを起動する。
※「–enable-dns-updates」はDNSへのIPアドレス自動更新を有効にするオプション

# ipa-client-install --enable-dns-updates

IPAユーザーのログイン時にホームディレクトリを自動生成する設定。

# pam-auth-update --enable mkhomedir

再起動して完了。

CentOS7でのFreeIPAサーバーの設定

前提条件

・ メインメモリが1GBだと失敗するので2GB程度は必要
・ プライマリのIPアドレスは192.168.0.10
・ セカンダリのIPアドレスは192.168.0.11

プライマリサーバーの設定

FQDNでホスト名を設定する。
※FQDNが192.168.0.10に名前解決できるようにしておく

# hostnamectl set-hostname ipa1.local.example.com

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

# yum install ipa-server ipa-server-dns

対話型のインストーラーを起動する。
※同時にbindも設定してもらう
※DNSフォワーダーも設定する
※そのほかは大体Enterで続行した

# ipa-server-install

ファイアウォールの例外を登録するよう促されるので登録する。
※サービス名で設定する場合は「ldap」ではなく「freeipa-ldap」なので注意
※freeipa-replicationはセカンダリを構築しない場合はいらない

# firewall-cmd --permanent --add-service={freeipa-ldap,freeipa-ldaps,freeipa-replication,dns,ntp,http,https}
# firewall-cmd --reload

参照するDNSサーバーを自身にする。

# nmcli connection modify コネクション名 ipv4.dns 192.168.0.10

初回ログイン時にホームディレクトリを自動生成するよう設定する。

# authconfig --enablemkhomedir --update

セカンダリサーバーの設定

プライマリのIdMにWEBブラウザでアクセスして、セカンダリのhostを追加。

セカンダリのホスト名をFQDNに変更する。
※FQDNが192.168.0.11に名前解決できるようにしておく

# hostnamectl set-hostname ipa2.local.example.com

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

# yum install ipa-server ipa-server-dns

IPAクライアントとして設定する。

# ipa-client-install

初回ログイン時にホームディレクトリを自動生成するよう設定する。

# authconfig --enablemkhomedir --update

ファイアウォールの例外を登録する。

# firewall-cmd --permanent --add-service={freeipa-ldap,freeipa-ldaps,freeipa-replication,dns,ntp,http,https}
# firewall-cmd --reload

レプリカインストールを実行する。
※プライマリからCA設定をコピーするため「–setup-ca」オプション指定
※DNSとしても動作させるため「–setup-dns」オプション指定

# ipa-replica-install --setup-ca --setup-dns --forwarder <forwarderのIPアドレス1> --forwarder <forwarderのIPアドレス2>

参照するDNSサーバーを自身にする。

# nmcli connection modify コネクション名 ipv4.dns 192.168.0.11