FreeIPAサーバーからIPAユーザーとWindows10のローカルユーザーを同期する

前提条件

この手順で設定したIPAサーバーを使用する
・IPAサーバーではexpectコマンドをインストール済み
この手順で設定したWindows10を使用する
・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

:# 引数で渡されたリストにいないユーザーの削除
set wmicresult=
for /f "usebackq tokens=*" %%P in (`wmic useraccount where "fullname LIKE '%%@%domain%'"`) do (
	set wmicresult=!wmicresult!%%P 
)
for %%P in (%wmicresult%) do (
	echo %%P | find "%domain%" 1>NUL
	if not ERRORLEVEL == 1 (
		set localname=%%P
		set localname=!localname:@%domain%=!
		echo !parameters! | find "!localname!," 1>NUL
		if ERRORLEVEL == 1 (
			net user !localname! /del 1>NUL
			rmdir /s /q !systemdrive!\Users\!localname! 1>NUL 2>NUL
		)
	)
)

:# 引数で渡されたリストでローカルにいないユーザーの作成
:# パスワードは実際のサインインには使用されないので固定値
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
	)
)

endlocal

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

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

前提条件

・WindowsクライアントはHomeでもProでも良い
・ここでのクライアントFQDNはwin01.local.example.com
・事前にクライアントのhostをKDC上で作成しておく

PC名の変更

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

認証サーバーの設定

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

ksetup /setdomain LOCAL.EXAMPLE.COM
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サーバーを使用する
・IdMなどでIPAサーバーにクライアント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ユーザーのログイン時にホームディレクトリを自動生成する設定。
/usr/share/pam-configs/mkhomedirを編集してDefault:yesに変更後、下記を実行する。

# pam-auth-update --enable mkhomedir

再起動して完了。

CentOS8で設定したIPAサーバー上でsamba共有を行う

IPAサーバーでsamba固有のオブジェクトクラスと属性を処理するように構成する。
※slapi-nisは有効にしない

# dnf install ipa-server-trust-ad
# ipa-adtrust-install

sambaの設定ファイルを編集する。

[global]
unix charset = UTF-8
dos charset = CP932
realm = LOCAL.EXAMPLE.COM
workgroup = LOCAL
security = ads
dedicated keytab file = FILE:/etc/samba/samba.keytab
kerberos method = dedicated keytab

[share]
path = /var/samba/share
writable = yes
inherit owner = yes
create mask = 0666
directory mask = 0777
valid users = @testgroup

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

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

SELinuxに例外を登録する。

# setsebool -P allow_smbd_anon_write=on
# chcon -R -t public_content_rw_t /var/samba/share

サービスを起動する。

# systemctl start smb
# systemctl enable smb

CentOS8でのFreeIPAサーバーの設定

前提条件

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

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

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

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

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

192.168.0.10    ipa1.local.example.com

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

$ dnf module list

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

# dnf install @idm:DL1

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

# dnf install ipa-server ipa-server-dns

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

# 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

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

# authconfig --enablemkhomedir --update

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

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

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

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

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

192.168.0.11    ipa2.local.example.com

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

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

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

# ipa-client-install

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

# authconfig --enablemkhomedir --update

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

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

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

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