Radius サーバーを Amazon Linux 2023 で作成して、WorkSpaces の多要素認証に利用する

記事タイトルとURLをコピーする

こんにちは🐱 技術課の山本です。

Radius サーバーを Amazon Linux 2023 で作成して、WorkSpaces の多要素認証に利用する

Amazon Linux 2 で Radius を作成する記事は見かけるものの、Amazon Linux 2023 の記事がないので書きます。

前提:本記事の想定する構成図

WorkSpaces

AD Connector 経由で、 Radius サーバー や Active Directory サーバーと認証を行い、ログインします。

AD Connector

WorkSpaces を Radius サーバー や Active Directory サーバーを利用して認証させます。

Active Directory サーバー

オンプレにあります。構成図は省略しているものの、VPN で接続します。
WorkSpaces にサインインするユーザーを管理します。
サインイン時のパスワード認証を行います。
ユーザー名の例:yamamoto

FreeRadius サーバー (Amazon Linux 2023)

WorkSpaces にサインインするユーザーの多要素認証を行います。
多要素認証の仕組みとしては、WorkSpaces にサインインするユーザー毎に事前に QR コードを発行します。
ユーザーが QR コードを Google Authenticator アプリで読み込むと、6 桁の一時コードをアプリ上に表示するようになります。少し時間が経つと表示するコードが変わる仕組みです。ユーザーはログイン時にアプリを開いて 6 桁の一時コードを入力します。
Active Directory のユーザーと同じ名前のローカルユーザーを、 OS 上に作成し、QR コードを発行、ユーザーに提供する運用になります。QR コードはユーザー作成時に 1 回のみ行います。
ユーザー名の例:yamamoto

参考にしたサイト

参考1:Google Authenticator を使って Amazon WorkSpaces に多要素認証ログイン
参考2:WorkSpaces での MFA の有効化 | AWS re:Post
参考3:RADIUSサーバーを構築して、WorkSpacesを多要素認証で運用する - サーバーワークスエンジニアブログ.

本記事の背景

上に記載した「参考3」 のブログでは Amazon Linux 2 を使って、Radius サーバーを作成して、WorkSpaces の多要素認証に利用しています。
RADIUSサーバーを構築して、WorkSpacesを多要素認証で運用する - サーバーワークスエンジニアブログ

EPEL のリポジトリから freeradius と freeradius-utils をインストールしています。
抜粋:

sudo amazon-linux-extras install -y epel
sudo yum -y install freeradius freeradius-utils google-authenticator

Amazon Linux 2 は、2025 年 6 月 30 日にサポート期限切れとなります。

Amazon Linux 2 のサポート終了日 (EOL、End of Life) は、次のバージョンへの移行に十分な時間を提供するために、2023 年 6 月 30 日から 2025 年 6 月 30 日に 2 年間延長されました。
参考:よくある質問 - Amazon Linux 2 | AWS

後継の Amazon Linux 2023 は 2027 年までのサポートがあります。
参考:Release cadence - Amazon Linux 2023

なお、 Amazon Linux 2023 では EPEL や EPEL のようなリポジトリはサポートされていません。
参考:Comparing Amazon Linux 2 and Amazon Linux 2023 - Amazon Linux 2023

Extra Packages for Enterprise Linux (EPEL) is a project in the Fedora community with the objective of creating a large array of packages for enterprise-level Linux operating systems. The project has primarily produced RHEL and CentOS packages. AL2 features a high level of compatibility with CentOS 7. As a result, many EPEL7 packages work on AL2. However, AL2023 doesn't support EPEL or EPEL-like repositories.

そこでどうするか考えます。参考ブログから判断材料を抜粋します。
参考:Amazon Linux 2023用追加パッケージを作ろう(立志編) - サーバーワークスエンジニアブログ 抜粋:

Amazon Linux 2は、CentOS7互換だったからEPELリポジトリをサポートできたと言いますが、これは「EPELリポジトリを使うことができますよ」という意味のサポートで、パッケージの不具合などの問い合わせなどをAWSが受けるわけではありません。
EPELは、もともとはFedoraプロジェクトの有志によるRHELの追加パッケージリポジトリです。
問い合わせなどはFedoraプロジェクトコミュニティの一員として問い合わせることはできるでしょうが、有償サポートと違って回答を得られるかは確実ではありませんし、バグがあったとしてパッチのあたったパッケージが提供される保証もありません。 https://fedoraproject.org/wiki/About_EPEL/ja
もちろん、redhatもサポートしません。 https://access.redhat.com/solutions/3358
〜略〜
注意: コミュニティリポジトリが信用できない、と言ってるわけではありません。 不具合やバグがあるならパッチ作って取り込んでもらいましょう。OSSの基本です。

Amazon Linux 2023 には、Fedora 34 , 35 , 36 のコンポーネントを含んでいる との記述があるため、Fedora のリポジトリからソースコードを入手して、rpm を作るのが良さそうです。 参考:Relationship to Fedora - Amazon Linux 2023

The Generally Available (GA) version of AL2023 isn't directly comparable to any specific Fedora release. The AL2023 GA version includes components from Fedora 34, 35, and 36. Some of the components are the same as the components in Fedora and some are modified. Other components more closely resemble the components in CentOS 9 Streams or were developed independently. The Amazon Linux kernel is sourced from the long-term support options that are on kernel.org, chosen independently from Fedora

以下の流れですね。

  1. ソースパッケージを入手する。
  2. Amazon Linux 2023でビルドしてみる。
  3. Amazon Linux 2023にインストールしてみる。
  4. 動作確認して動けばラッキー。

手順

それでは作成してみましょう。

OS

OS は以下としました。
CPU は Arm だと躓きそうだなと直感的に判断し、intel にしました。Arm は試していません。

項目 設定値
Amazon マシンイメージ (AMI) Amazon Linux 2023
CPUアーキテクチャ x86_64
AMI ID ami-098940df4d3292e9a
説明 Amazon Linux 2023 AMI 2023.2.20231030.1 x86_64 HVM kernel-6.1

画面:

なお、最新の Amazon Linux の情報は以下コマンドからも確認できます。
参考:AMI パブリックパラメータを呼び出す - AWS Systems Manager

aws ssm get-parameters-by-path \
    --path /aws/service/ami-amazon-linux-latest

インスタンスタイプ

t3.small としました。
小さければあとから変更可能です。

EC2 のその他の設定

Systems Manager から接続できるように インスタンスプロファイルを付与しました。
付与ポリシー:AmazonSSMManagedInstanceCore
セキュリティを考慮してインスタンスメタデータを「v2 のみ 」に設定しました。

freeradius-3.2.2-5. の src.rpm から rpm を作成 (その 1 )

ここからは Systems Manager で OS にログインして作業していきます。

root で作業します。
Fedora 39 の release ブランチ から src.rpm を入手します。 また、src.rpm から rpm を作成するために、rpm-build をインストールします。

# root
sudo su -

# src.rpm を Get 
wget http://ftp.riken.jp/Linux/fedora/releases/39/Everything/source/tree/Packages/f/freeradius-3.2.2-5.fc39.src.rpm

# rpm-build インストール
yum install rpm-build.x86_64

では、rpm を作りましょう!!!

# src.rpm ▶ rpm 
rpmbuild --rebuild freeradius-3.2.2-5.fc39.src.rpm

失敗しましたああああああああああああああああああああああああああああああああああああ!!!!!!!!!!
エラーを見ると、freeradius-3.2.2-5. の src.rpm から rpm を作成をインストールするための前提パッケージをインストールする必要があります。

freeradius-3.2.2-5. の src.rpm から rpm を作成するための前提パッケージをインストール

前提パッケージをインストールしましょう。
yum(dnf) でインストールしてみます。

# 前提パッケージをインストール
yum install -y autoconf
yum install -y chrpath
yum install -y gcc
yum install -y gdbm-devel
yum install -y json-c-devel
yum install -y krb5-devel
yum install -y libcurl-devel
yum install -y libpcap-devel
yum install -y libpq-devel
yum install -y libtalloc-devel
yum install -y libyubikey-devel
yum install -y make
yum install -y mariadb-connector-c-devel
yum install -y net-snmp-devel
yum install -y net-snmp-utils
yum install -y openldap-devel
yum install -y openssl-devel
yum install -y pam-devel
yum install -y perl-ExtUtils-Embed
yum install -y perl-devel
yum install -y perl-generators
yum install -y python3-devel
yum install -y readline-devel
yum install -y sqlite-devel
yum install -y unixODBC-devel
yum install -y ykclient-devel
yum install -y zlib-devel

libyubikey-devel と ykclient-devel だけ失敗しました。yum (dnf) にはないみたいです。
libyubikey-devel と ykclient-devel は Fedora 39 の release ブランチ から src.rpm を入手してビルドします。
では、libyubikey-devel をインストールしましょう。

# libyubikey-devel
wget http://ftp.riken.jp/Linux/fedora/releases/39/Everything/source/tree/Packages/l/libyubikey-1.13-20.fc39.src.rpm
rpmbuild --rebuild libyubikey-1.13-20.fc39.src.rpm
rpm -ivh rpmbuild/RPMS/x86_64/libyubikey-1.13-20.amzn2023.x86_64.rpm
rpm -ivh rpmbuild/RPMS/x86_64/libyubikey-devel-1.13-20.amzn2023.x86_64.rpm

libyubikey-devel は すんなりビルドできました。
エラーは割愛するものの、libyubikey-devel の rpm をインストールするには、libyubikey を先にインストールする必要がありました。(4 行目)
うまくいきました🎉

では、ykclient-devel をインストールしましょう。

wget http://ftp.riken.jp/Linux/fedora/releases/39/Everything/source/tree/Packages/y/ykclient-2.15-17.fc39.src.rpm
yum install -y help2man
rpmbuild --rebuild ykclient-2.15-17.fc39.src.rpm
rpm -ivh rpmbuild/RPMS/x86_64/ykclient-2.15-17.amzn2023.x86_64.rpm
rpm -ivh rpmbuild/RPMS/x86_64/ykclient-devel-2.15-17.amzn2023.x86_64.rpm

ykclient-devel は help2man が前提パッケージだったので yum でインストールしました。
すると、ビルドができました。
libyubikey-devel と同様に ykclient-devel をインストールするために、ykclient を先にインストールする必要がありました。(4 行目)
うまくいきました🎉

こんな感じで、freeradius-3.2.2-5. の前提パッケージをインストールしました。 前提パッケージを yum でインストールしてみて、見つからなかったらソースコードをFedora 39 の release ブランチ から探してビルドしてインストールしました。

freeradius-3.2.2-5. の src.rpm から rpm を作成 (その 2 )

では気を取り直してもう一度、さっき失敗した rpm を作りましょう!!!

# もう一度 src.rpm ▶ rpm
rpmbuild --rebuild freeradius-3.2.2-5.fc39.src.rpm

ビルドが行われています・・・

ドキドキ・・・

ワクワク・・・

お・・

ビルドできました🎉🎉🎉🎉🎉 (ビルド時間 2,3 分。カップ麺の待ち時間くらいでした。)

freeradius-3.2.2-5 の rpm をインストール (その 1 )

ビルドできた rpm をインストールしていきましょう。

rpm -ivh rpmbuild/RPMS/x86_64/freeradius-3.2.2-5.amzn2023.x86_64.rpm
rpm -ivh rpmbuild/RPMS/x86_64/freeradius-utils-3.2.2-5.amzn2023.x86_64.rpm

失敗しました!! freeradius-utils の rpm をインストールするための前提パッケージが足りないようです。

freeradius-utils の rpm をインストールするための前提パッケージをインストール

めげずにやっていきましょう。前提パッケージをインストールします。

yum install -y perl-DBI
yum install -y perl-GDBM_File
yum install -y perl-Net-IP

perl-Net-IP だけ失敗しました。ソースからビルドしてインストールします。

wget http://ftp.riken.jp/Linux/fedora/releases/39/Everything/source/tree/Packages/p/perl-Net-IP-1.26-31.fc39.src.rpm
rpmbuild --rebuild perl-Net-IP-1.26-31.fc39.src.rpm
rpm -ivh rpmbuild/RPMS/noarch/perl-Net-IP-1.26-31.amzn2023.noarch.rpm

インストールできました🎉

freeradius-3.2.2-5 の rpm をインストール (その 2 )

失敗していた freeradius-utils の rpm をインストールしましょう。

rpm -ivh rpmbuild/RPMS/x86_64/freeradius-utils-3.2.2-5.amzn2023.x86_64.rpm

インストールできました🎉

freeradius-3.2.2-5 を起動してみる

せっかくインストールしたので、起動してみましょう。

systemctl start radiusd

起動失敗しましたああああああああああああああああああああああ!!!!!!!!!!!!!!!!!!
Radiusd の起動は以下のようにデバッグできます。

/usr/sbin/radiusd  -C -lstdout -xxx

rlm_eap_tls という TLS 通信用モジュールで使用する証明書がないため、起動に失敗しているようです。
作成しましょう。

vim /etc/raddb/radiusd.conf

上記設定ファイルを読むと、certs ディレクトリ配下に証明書を作る方法が書いてあるようです。

読んでみましょう。

vim /etc/raddb/certs/README.md

bootstrap というシェルスクリプトで作成できるようです。
中を見ると、以下の cnf ファイルから CA認証機関、サーバー証明書、クライアント証明書を作っています。

  • ca.cnf
  • client.cnf
  • server.cnf

これらの証明書の期限は 60 日と短くなっているため、伸ばしておきましょう。

3 ファイルとも 100 年にしました。(画像では 365 と書いています。実際には 36500 にしています。)

では、証明書を作成しましょう。

/etc/raddb/certs/bootstrap

できました🎉 Radius を起動してみましょう。

systemctl start radiusd

起動できました🎉

Google Authenticator

さて、続いて Google Authenticator を yum (dnf) でインストールします。

yum install -y google-authenticator

すんなり入りました。嬉しいですね。🎉

Radius の設定

RADIUSサーバーを構築して、WorkSpacesを多要素認証で運用する - サーバーワークスエンジニアブログ の以下目次以降を実施すると、Radius として使えるようになります。

RADIUS経由の認証を許可するグループの作成

systemctl start radiusd のみ、restart に読み替えてください。

systemctl restart radiusd

確認

AD Connector に Radius サーバーを設定してみました。

ログインできました🎉 実際「完了」になってからログイン可能になるまで 10 分近く待ちました。(ヒヤヒヤしました。)
Radius サーバーを使った多要素認証を実装できました。 🎉🎉🎉🎉🎉

おわりに + 補足

Amazon Linux 2023 では EPEL を使えなくなったことにより、これまで Amazon Linux 2 で導入できた追加パッケージの導入が難しくなるケースがあります。
今回はなんとか、Radius を導入することが出来ました。

補足として、/etc/yum.repos.d に Fedora のリポジトリを追加しても、インストールできたりはしました。 以下の理由から src.rpm からインストールする方式を採用しました。

  • Amazon Linux 2023 が対応していない新しいバージョンが入ってしまう可能性がある。その際に、依存パッケージのバージョンが上がってしまうと、インストール済みの他のパッケージにも不具合がでる恐れがある。src.rpm からビルドすることで、依存するパッケージも把握でき、適切なバージョンを導入できる。

余談

今年は紅葉を見ない間に、葉が散り冬になって、気付いたら雪も降っていました。
来年は紅葉を見ようと思います。笑

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、登山(たまに)