Amazon Linux2 に Samba 4.11.1 + FreeRADIUS 3.0.13 + Keycloak 7.0.1 をインストールする
以前に Samba4 / FreeRADIUS3 / Keycloak6 の構築に関して、下記のメモを書きました。
- AmazonLinux2 に最新の Samba4.10.5 をドメインコントローラとしてインストールする
- AmazonLinux2 に Samba4 と FreeRADIUS3 を同居させ、Samba でユーザを一元管理する
- AmazonLinux2 に Nginx で SSL/TLS 終端構成で Keycloak をインストールする
- AWS 上に Samba4 + Keycloak6 + FreeRADIUS3 な認証サーバを構築する
Samba 4.11.1 や Keycloak 7.0.1 がリリースされている為、インストール手順をアップデートしておきます。
ゴール¶
今回は最終的に以下の環境を構築します。
- Amazon Linux release 2 (Karoo)
- Python 3.7.4
- Samba 4.11.1
- Keycloak 7.0.1
- Nginx 1.17.4
図示すると以下のようになります。
この構成は以下の特徴を持ちます。
- 一台の Amazon Linux2 内に FreeRADIUS、Samba、Keycloak を同居させ、様々な認証プロトコルに対応させる
- 認証ソース自体は Samba で一元管理する
- Keycloak は Samba と定期的に同期し、ユーザ情報をキャッシュする
- (認証情報をキャッシュしない為) FreeRADIUS は RADIUS 認証要求を受ける度に Samba へ問い合わせする
- ユーザのパスワード変更は以下、どちらでも可能
- Samba でもパスワード変更可能
- Keycloak でもパスワード変更可能
- Samba と Keycloak は認証情報を同期するので、どちらでパスワード変更しても問題無い
- KeyCloak 側でパスワード変更した場合、即時 Samba と同期する
- Samba 側でパスワード変更した場合、Keycloak ~ Samba 間の同期が実行されるまで、パスワードは同期されない (Keycloak 側から手動で強制同期させることは可能)
Samba のインストール¶
EPEL の有効化¶
Samba をインストールする事前準備として、前提となるパッケージをインストールします。 EPEL (Extra Packages for Enterprise Linux) からパッケージをインストールすることになりますが、AmazonLinux2 なので amazon-linux-extras を使って EPEL リポジトリをインストールします。
1 |
|
必要パッケージのインストール¶
必要なパッケージをインストールしていきます。 Amazon Linux2 は初期状態で Python2 がインストールされています。 しかし、Samba 4.11 のリリースノート の REMOVED FEATURES 欄によると 4.11 からは Python2 サポートが無くなったようです。
Samba 4.11 will not have any runtime support for Python 2.
If you are building Samba using the '--disable-python' option (i.e. you're excluding all the run-time Python support), then this will continue to work on a system that supports either python2 or python3.
その為、python3-devel
をインストールし、Python3 が利用出来るようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
追加で pam-devel
もインストールします。 先にインストールしたパッケージ群と同時に pam-devel
をインストールしようとすると上手くいかない (pam-devel
がインストールされない) 為、pam-devel
は別にインストールします。
1 |
|
ソースコードからインストールする¶
現時点ではリポジトリからインストール出来るのは 4.8.3 とバージョンがやや古く、少なくても 2 カ月以上アップデートされていません。 しかも、この 4.8.3 のパッケージには Samba をドメインコントローラとして構築する際には多用することになる samba-tool がなぜかインストールされません。 この件についてはネット上でも How to install samba-tool on Amazon Linux と質問されている方がおり、現時点では回答されていません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
その為、今回はソースコードから Samba をインストールしていきます。 Samba 4.10 系までは PYTHON=python2
を指定することで Python2 で Samba をビルド出来たのですが、Samba 4.11 系からは Python2 系がサポートされなくなりました。 しかし、今回は Python3 をインストールしてあるので、Python バージョンを指定せず、そのまま ./configure; make; make install
します。
1 2 3 4 5 6 7 8 |
|
パスを追加する¶
ソースコードから Samba をインストールした場合、パスを指定しない限り実行ファイルは /usr/local/samba/bin
配下にインストールされます。 標準でここにはパスが通っていない為、利便性を考えてパスを通しておきます。 今回は root ユーザで操作することだけを想定し、/root/.bash_profile
にパスを追加しました。
1 |
|
パス追加後は source ~/.bash_profile
するか、または SSH アクセスをログアウト / ログインし直してパス追加を反映します。 これで Samba のインストールは完了です。
ドメインの設定¶
次はドメインを設定していきます。
ドメインの作成¶
まず、ドメイン自体を新規作成します。 対話的にドメインを構築する場合は以下のように実行します。
1 |
|
ある程度、パラメータを指定して非対話的に構築する場合は以下のように実行します。 非対話式の実行オプションを見る限り、DNS Forwarder の指定が見当たらないようですが、実際に非対話で実行した後で生成される設定ファイルを確認すると、「予め /etc/resolv.conf
に設定されていた DNS サーバ」を DNS Forwarder として設定されていました。
1 2 3 4 5 6 7 |
|
ドメインを構築すると設定ファイルは /usr/local/samba/etc/smb.conf に生成されます。 例えば以下のような内容になっているはずです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
LDAPS を強制しない設定¶
初期状態では LDAPS を強制する設定になっているようです。 セキュリティ上はこの方が好ましいですが、検証上の理由から LDAPS を強制しない設定へ変更するには /usr/local/samba/etc/smb.conf
の [global] セクションへ以下を追加します。
1 2 |
|
LDAPS 接続用のサーバ証明書を用意する¶
LDAPS 接続にサーバ証明書を用意します。 自己証明書なり、Let's Encrypt で取得するなり、いずれかの方法で用意します。 取得した証明書や秘密鍵は /etc/letsencrypt/certificates
に配置するものとします。
1 |
|
証明書 / 秘密鍵はパーミッションを修正し、所有者以外はアクセス出来ないようにしておきます。
1 |
|
配置した証明書 / 秘密鍵を参照するよう、/usr/local/samba/etc/smb.conf
の [global] セクションに下記を追加します。
1 2 3 4 |
|
パスワードポリシーの設定¶
Samba のパスワードポリシーは samba-tool domain passwordsettings show
で確認出来ます。 Samba 4.11.1 の初期状態では以下のようになっていました。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
各々の項目は以下の意味を持ちます。
No. | Item | Default | Description |
---|---|---|---|
1 | Password complexity | on | パスワードの複雑さを強制するか (英数記号混在、3 文字以上、ユーザ名を含まない) |
2 | Store plaintext passwords | off | 平文でパスワードを保存するか |
3 | Password history length | 24 | 保存するパスワードの世代数 |
4 | Minimum password length | 7 | パスワード長の最小 |
5 | Minimum password age (days) | 1 | パスワード変更禁止期間 (0 だと即時変更可能) |
6 | Maximum password age (days) | 42 | パスワード有効期限 (0 だと無期限) |
7 | Account lockout duration (mins) | 30 | 「Account lockout threshold」で定義された回数、パスワード入力を間違えた場合にロックアウトする期間 |
8 | Account lockout threshold (attempts) | 0 | パスワード入力に失敗を許容する回数 (0 だとロックアウトしない) |
9 | Reset account lockout after (mins) | 30 | パスワード試行回数がゼロに戻るまでの時間 |
デフォルトから以下のように変更します。
- パスワード長の最小を「8」へ変更
- パスワード変更禁止期間を「0」へ設定 (パスワードを即時、変更可能にする)
- パスワード変更期間を「0」へ設定 (パスワードを無期限にする)
- パスワードがロックアウトされるまでの入力試行回数を「5」へ設定 (5 回連続でパスワードを間違えるとロックアウト)
実際には以下のコマンドで変更します。
1 2 3 4 |
|
変更後のパスワードポリシーは以下のように表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
DNS 設定の変更¶
DNS の設定は以下の方針で変更します。
- AmazonLinux2 自身が参照する DNS サーバを自分自身 (127.0.0.1) にする
- SAMBA_INTERNAL な DNS サービスの DNS Forwarder は Amazon 提供の DNS サーバにする
初期状態のままでは DNS の設定を変更しても OS を再起動する度… というより、正確には DHCP Client が実行される度、DHCP サーバから受信した DNS サーバ設定を上書きしてしまいます。 これを避ける為、DHCP の設定を変更し、DNS 関連のパラメータは受信しない (上書きしない) ようにします。 具体的には /etc/sysconfig/network-scripts/ifcfg-eth0
のうち、PEERDNS=yes
を no
へ変更します。
1 2 3 4 5 6 7 8 9 10 11 |
|
ワンライナーで実行したければ以下のようにします。
1 |
|
これで DNS 関連の設定は上書きされなくなりました。 続いて OS が参照する DNS サーバのアドレスを変更します。 対象の設定ファイルは /etc/resolv.conf です。 変更前は以下のようになっているはずです。
1 2 3 4 |
|
これを以下のように nameserver 127.0.0.1
へ書き換えます。
1 2 3 4 |
|
設定ファイルの修正が完了したら network サービスを再起動し、設定変更を反映します。
1 |
|
起動&自動起動の設定¶
今回はパッケージマネージャでは無く、ソースコードから Samba をインストールした為、systemd 用のスクリプトがありません。 その為、以下の内容で systemd 用のスクリプトを新規作成しておきます。 後で構築する FreeRADIUS も Keycloak も認証の一時ソースは Samba で行う為、Samba が停止しても自動的に再起動するよう Restart=always
を指定しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
これで systemctl コマンドを通じての起動や自動起動が行えるようになりました。 ファイルを追加したので daemon-reload した後、Samba を起動&自動起動するようにしておきます。
1 2 3 |
|
OU / ユーザ / グループの作成¶
ドメインのセットアップが完了したので OU やユーザ、グループを作成していきます。 ほぼ全ての作業を samba-tool で実施していきます。 ここでは以下の作業を実施するものとします。
- ユーザ格納用に
People
という OU を作成する - グループ格納用に
Groups
という OU を作成する Groups
OU 内にMembers
というグループを作成するPeople
OU 内にUser1
ユーザをPass1
というパスワードで作成するUser1
ユーザのパスワード有効期限を「無期限」にするUser1
ユーザをMembers
グループに所属させる
この要件を満たす場合、実行するコマンドは以下の通りです。
1 2 3 4 5 6 7 8 9 |
|
FreeRADIUS のインストール¶
FreeRADIUS をインストールしていきます。
標準リポジトリからインストールする¶
現時点で AmazonLinux の標準リポジトリからインストール出来る FreeRADIUS のバージョンは 3.0.13 でした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
FreeRADIUS をインストールします。
1 |
|
LDAP モジュールの設定¶
LDAP との接続は /etc/raddb/mods-available/ldap
に定義されています。 設定例は以下の通りです。 ここでは「グループに応じて認証先を分けられる」ように、3 つの設定を行っています。
- ldap
- ldap admin (Admins グループで認証する)
- ldap members (Members グループで認証する)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
ファイルの用意が出来たらシンボリックリンクを作成し、有効化します。
1 |
|
サイトの設定¶
LDAP 認証毎のサイト設定を行います。 先の手順で LDAP 設定を 3 グループ作成したので、ここでは対になるサイトを 3 つ、定義します。
/etc/raddb/sites-available/ldap¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
/etc/raddb/sites-available/ldap_admins¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
/etc/raddb/sites-available/ldap_members¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
ファイルの用意が出来たらパーミッションとオーナーを修正してからシンボリックリンクを作成し、サイトを有効化します。
1 2 3 4 5 6 |
|
クライアントの定義¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
起動&自動起動の設定¶
これで FreeRADIUS の設定は完了です。 デーモンを起動&自動起動設定します。
1 2 |
|
認証テストを実施する¶
radtest を使うと RADIUS の認証テストを行うことが出来ます。 実行例は以下の通りです。
1 |
|
Keycloak のインストール¶
続いて Keycloak をインストールしていきます。
Java のインストール¶
Keycloak は Java で書かれている為、まず Java をインストールします。
1 2 3 |
|
インストール¶
Keycloak をインストールするにはパッケージをダウンロードし、任意の位置に配置するだけです。 今回は /opt/keycloak
配下に配置しました。
1 2 3 |
|
管理用ユーザの作成¶
初期状態ではユーザが存在しないので、Keycloak を起動する前に管理ユーザを作成します。
1 |
|
proxy-address-forwarding の設定¶
今回は SSL/TLS 終端を Nginx に担当させる Reverse Proxy 構成にします。 その為、/opt/keycloak/standalone/configuration/standalone.xml
の http-listner 定義箇所を探し、下記のように proxy-address-forwarding="true"
の設定を追加します。
変更前¶
1 |
|
変更後¶
1 |
|
ワンライナーで実行したい場合は以下のようにします。
1 |
|
サービス登録 及び 起動&自動起動の設定¶
systemd から制御出来るよう、サービス登録を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
用意が出来ましたので、自動起動&起動設定を実施します。 Keycloak が完全に起動するまでには、やや時間がかかるかも知れません。
1 2 3 |
|
Nginx のインストール¶
続いて Keycloak のフロントエンド用 Nginx をインストールします。
Nginx Mainline リポジトリからインストールする¶
AmazonLinux 標準リポジトリ上の Nginx は 1.12.2 とややバージョンが古いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
その為、Nginx の Mainline リポジトリからインストールします。 下記を実行し、Nginx 公式リポジトリを追加します
1 2 3 4 5 6 7 8 |
|
現時点では Nginx 1.17.4 がインストールされるようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Nginx をインストールします。
1 |
|
Keycloak 用の設定追加¶
Nginx に Keycloak のフロントエンド処理をさせる為、以下の内容で /etc/nginx/conf.d/keycloak.conf を新規作成します。 証明書 / 秘密鍵は環境に応じて、パスを変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
起動&自動起動の設定¶
Nginx の自動起動&起動設定を実施しておきます。
1 2 |
|
Keycloak の設定¶
ここからは Keycloak を設定していきます。
Step.1¶
ブラウザから https:://www.example.com
(FQDN は環境に応じて修正) へアクセスすることで以下のように Keycloak のログイン画面が表示されることを確認します。 トップ画面が表示されることが確認出来たら Administration Console
をクリックします。
Step.2¶
管理ユーザ名とパスワードを入力してログインします。
Step.3¶
デフォルトで Master
という Realm が存在しています。 今回は新たに Relam を追加しますので、画面左上の Realm 名 (ここでは Master
) にマウスカーソルを合わせ、表示されたメニューから Add realm
をクリックします。
Step.4¶
Name に追加したい Realm 名を入力します。 今回は Smaba 上の Members
グループで認証させる想定とし、Realm 名は members
にしました。
Step.5¶
必須の設定ではありませんが、表示を日本語化することも可能です。 Realm の Themes
はデフォルトで以下のようになっていました。
Internationalization Enabled
を ON
にするとサポートされる言語の一覧が表示されます。 Default Locale
を ja
にし、Save
をクリックします。
Step.6¶
今回はユーザ認証を Samba ドメインで行います。 Keycloak からは LDAP で Samba へ接続しますので、画面左側にあるメニューから User Federation
をクリックし、Add provider...
から ldap
をクリックします。
Step.7¶
以下のように LDAP 接続用パラメータを入力する画面になります。
設定例は以下の通りです。
Required Settings¶
必須 | 項目 | デフォルト値 | 設定例 |
---|---|---|---|
Enabled | ON | ON | |
Console Display Name | ldap | ldap | |
Priority | 0 | 0 | |
Import Users | ON | ON | |
Edit Mode | WRITABLE | ||
Sync Registrations | OFF | OFF | |
* | Vendor | Active Directory | |
* | Username LDAP attribute | sAMAccountName | |
* | RDN LDAP attribute | sAMAccountName | |
* | UUID LDAP attribute | objectGUID | |
* | User Object Classes | person, organizationalPerson, user | |
* | Connection URL | ldap://127.0.0.1 | |
* | Users DN | OU=People,DC=example,DC=com | |
* | Bind Type | simple | simple |
Enable StartTLS | OFF | OFF | |
* | Bind DN | CN=Administrator,CN=Users,DC=example,DC=com | |
* | Bind Credential | (Administrator のパスワード) | |
Custom User LDAP Filter | (&(objectCategory=Person)(sAMAccountName=*)(memberOf=CN=Members,OU=Groups,DC=example,DC=com)) | ||
Search Scope | One Level | One Level | |
Validate Password Policy | OFF | OFF | |
Use Truststore SPI | Only for ldaps | Only for ldaps | |
Connection Pooling | ON | ON | |
Connection Timeout | |||
Read Timeout | |||
Pagination | ON | ON |
Kerberos Integration¶
必須 | 項目 | デフォルト値 | 設定例 |
---|---|---|---|
Allow Kerberos authentication | OFF | OFF | |
Use Kerberos For Password Authentication | OFF | OFF |
Sync Settings¶
必須 | 項目 | デフォルト値 | 設定例 |
---|---|---|---|
Batch Size | 1000 | 1000 | |
Periodic Full Sync | OFF | OFF | |
Periodic Changed Users Sync | OFF | OFF |
Cache Settings¶
必須 | 項目 | デフォルト値 | 設定例 |
---|---|---|---|
Cache Policy | DEFAULT | DEFAULT |
Step.8¶
初期設定では first Name
の項目が cn
属性とマッピングされています。 これでは不都合なので first Name
を (cn
では無く) givenname
とマッピングし直します。 先ほど定義した LDAP の設定画面上部の Mappters
を選択し、表示された項目の中から first Name
をクリックして次に進みます。
first Name
は、初期状態で以下の設定になっていました (LDAP Attribute が cn
になっているのが分かります)。
以下のように LDAP Attribute を givenname
に変更したら画面下部にある Save
をクリックします。
Step.9¶
ここまでの設定が終わったら LDAP 設定の Settings
画面下部に幾つかボタンが表示されます。 このボタンのうち、Synchronize all users
をクリックし、LDAP からユーザ情報を読み込みます。
Step.10¶
左側のナビゲーションメニューから User
を選択し、画面上部の View all users
ボタンをクリックします。 LDAP と正しく連携出来ていれば、LDAP から読みだしたユーザ情報の一覧が表示されるはずです。
Step.11¶
以降は SAML や OpenID Connect で認証を行う SP 側の設定を左側のナビゲーションメニューの Clients
から実施していきます。
Keycloak からパスワードを変更する¶
Keycloak からパスワードを変更してみます。
Step.1¶
Keycloak からパスワードを変更するには、まずパスワードを変更したい Realm のユーザログイン画面へアクセスします。 URL は以下のようになります。
https://[FQDN]/auth/realms/[REALM]/account
例えば FQDN が「www.example.com
」、Realm 名が「members
」であれば URL は以下のようになります。
https://www.example.com/auth/realms/members/account
実際のログイン画面は以下の通りです。 ユーザ名とパスワードを入力してログインします。
Step.2¶
ログイン直後は アカウントの編集
画面が表示されます。 左側のナビゲーションメニューから パスワード
をクリックします。
Step.3¶
パスワード変更
画面が表示されます。 現在のパスワードと変更後のパスワードを入力して 保存
をクリックします。 これでパスワード変更は完了です。