「FreeIPA」の機能を試してみよう

2018年1月31日(水)
森若 和雄

はじめに

前回は、Linuxの認証基盤である「FreeIPA」について、IPAサーバ/クライアントの主なコンポーネントを紹介しました。今回は、実際にFreeIPAをインストールして、FreeIPAが持つ多くの機能のいくつかを見ていきましょう。

FreeIPAのインストール準備

まずは、FreeIPAをインストールする前準備として、手元のKVM環境にお試し用のipaサーバを構築します。

前回で解説したように、基本的にFreeIPAが管理するドメインにはKerberosでログインするため、他のKerberosで管理されていないドメインでなくてはいけません。DNSで正引き・逆引きが可能な必要があるので、libvirtのネットワーク設定を変更して、あらかじめ仮想マシンに対してdnsmasqが提供するDNSにipa.example.comとclient.example.comのエントリを定義しておきます。

# virsh net-edit default

<network>
  <name>default</name>
  <uuid>635536af-9e63-49b0-8c01-b7fd269417de</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:2d:34:13'/>
  <domain name='example.com'/>
  <dns>
    <host ip='192.168.122.2'>
      <hostname>client</hostname>
    </host>
    <host ip='192.168.122.10'>
      <hostname>ipa</hostname>
    </host>
  </dns>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.200' end='192.168.122.220'/>
    </dhcp>
  </ip>
</network>

ホストからも名前でアクセスできるよう、/etc/hostsにも同様に定義しておきます。

192.168.122.2 client.example.com
192.168.122.10 ipa.example.com

これらの設定を反映するため、dnsmasqを再起動します。このネットワークに繋がっているVMのブリッジへの接続が全て切れてしまうので注意してください。

# virsh net-destroy default
# virsh net-start default

利用する環境の都合でDNSが存在しない場合は、インストーラのオプションで「--no-host-dns」と「インストール中にDNSによる名前解決をしない」を指定します。その場合でも最低限ブラウザを利用するマシンからは名前解決(/etc/hostsで可)ができないとFreeIPAのWeb UIが利用できないので注意してください。

FreeIPAのインストール

前準備ができたので、さっそくFreeIPAをインストールしていきましょう。まず、仮想マシンに「Fedora27 Server」を導入します。上で設定したアドレスを指定し、vCPUは4、メモリは8GBを割り当てます。

次にFreeIPAサーバのパッケージをインストールし、ipa-server-installコマンド を実行します。ipa-server-installはオプションでの指定がなければ必要な質問を対話的に行います。

# dnf install -y freeipa-server
# ipa-server-install

今回は以下の設定を行いました。

  • DNSを設定するか? → 設定しない
  • サーバ名は何か? → ipa.example.com
  • realm名は何か? → EXAMPLE.COM

その後、LDAP全体を管理するDirectory Managerのパスワードと、普段利用するFreeIPAの管理者adminのパスワードを入力します。

設定のサマリを確認されるので、意図した通りになっていることを確認して「yes」と入力すると、インストーラが各種の設定を実施します。私の環境では10分ほどかかりました。

問題なくインストールが終了すると、最後に下記のように表示され、次にやるべきこととアドバイスが表示されます。

Setup complete

Next steps:
        1. You must make sure these network ports are open:
                TCP Ports:
                  * 80, 443: HTTP/HTTPS
                  * 389, 636: LDAP/LDAPS
                  * 88, 464: kerberos
                UDP Ports:
                  * 88, 464: kerberos
                  * 123: ntp

        2. You can now obtain a kerberos ticket using the command: 'kinit admin'
           This ticket will allow you to use the IPA tools (e.g., ipa user-add)
           and the web user interface.

Be sure to back up the CA certificates stored in /root/cacert.p12
These files are required to create replicas. The password for these
files is the Directory Manager password
  • firewallのポート開放
  • ipaコマンド(FreeIPAのコマンドラインクライアント)を利用する前にkinit adminで認証するようにという注意
  • CA局の証明書が/root/cacert.p12にあるのでバックアップするようにという注意

この指示に従って、firewallctlでfirewallのポートを開きます。

# firewallctl zone -p FedoraServer add service http https ldap ldaps kerberos kpasswd ntp
# firewallctl reload

これでFreeIPAサーバの基本的なインストールができました。

ホストマシンからhttps://ipa.example.comへ接続するとFreeIPAのWeb UIが表示され、adminユーザとしてログインすると管理画面が表示されます。

図1:FreeIPA サーバの管理画面

クライアントの登録

続いて、FreeIPAにclient.example.comというシステムを登録します。ipa-clientをインストールして、ipa-client-installを実行します。

# dnf install -y ipa-client
# ipa-client-install

今回はDNSを設定していないため自動検出が働かないので、ドメインとFreeIPAサーバの質問に対応して入力します。

登録に利用するユーザ(今回はadminで行います)とパスワードを入力します。設定を確認して「yes」と入力すると各種設定、システムの登録、ホスト証明書の作成と取得、SSHのホスト公開鍵をFreeIPAへ登録などを行います。

図2:FreeIPA サーバへ各種設定や登録等を行う

もしここで何か問題が発生する場合は、クライアントとFreeIPA間の通信が可能か確認してみましょう。

ユーザの登録

次にユーザを登録します。Kerberosにadmin@EXAMPLE.COMとしてログインしましょう。この作業はipaサーバまたはドメインに参加しているclient上のどちらでも可能です。

$ kinit admin

この後の操作はipaコマンドを使用します。

$ ipa user-add

登録したいユーザの名前とアカウント名が質問されるので、入力してユーザを作成します。

$ ipa passwd <<ユーザ名>>

パスワードを2回入力して、パスワードを登録します。

これでユーザ登録は完了です。早速ログインしてみましょう。今登録したパスワードがexpireされ、変更を求められます。これはFreeIPAのポリシーで、管理者が再発行したパスワードは1回で使い捨てることが強制されるためです。

図3:登録したユーザでログイン

登録したユーザとしてログインできたら、klistコマンドでKerberosのチケットが付与されていることを確認します。idコマンドで表示されるuidとipa user-show <<ユーザ名>>で表示されるuidが同じことを確認できます。

Web UIの利用

それでは、Web UIを使用してみましょう。ホスト側でhttps://ipa.example.com/へ接続します。adminユーザでログインすると、下のような画面がでてきます。ユーザ一覧の他にも上部のメニューに多くの項目があります。

図4:Web UIの管理画面

各ユーザ名をクリックすると表示される詳細ページで[Actions]をクリックすると、いくつかの操作ができます。

図5:Web UI詳細ページの[Actions]からはいくつかの操作が可能

  • パスワードの変更
  • ユーザの有効化/無効化/削除
  • (ロックアウトされていた場合の)ロック解除
  • OTPトークンの追加
  • グループへの所属を再生成
  • ユーザ証明書発行

OTPトークンの生成

ここで、ワンタイムパスワードを生成するトークンを発行し、ログインに利用してみましょう。ユーザ詳細の[Actions]から[Add OTP Token]を選択し、トークン生成のUIを出します。[Add]ボタンをクリックするとTOTPまたはHOTPのトークンをが生成され、QRコードが表示されます。このトークンはスマートフォンのアプリケーション(Google AuthenticatorやFreeOTPなど)で利用できます。

後からトークンを管理したい場合は、[Authentication]メニュー内の[OTP Tokens]から検索して有効期間の設定や無効化などの操作が可能です。

デフォルトでは各ユーザがそれぞれの権限で自分用にOTPトークンの生成を行えるので、トークンの配布はセルフサービスで行います。

2要素認証によるログイン

上記の作業ではトークンを作ってユーザに割り当てましたが、これだけでは認証に利用されません。認証方式をパスワードのみによる認証から変更する必要があります。

ドメイン全体の認証ポリシーを変更するには、[IPA Server]→[Configuration]→[ユーザーオプション]→[Default user authentication types]から[Two factor authentication (password + OTP)]を選択し、デフォルトの認証方法をワンタイムパスワード付きに指定します。このモードでは、有効なトークンが紐づいているユーザは2要素認証で認証し、有効なトークンが紐づいていないユーザはパスワードのみで認証します。

クライアントでログインしようとすると、プロンプトが通常の"Password: "ではなく"First Factor: "となっています。ここでパスワードを入力します。次に"Second Factor: "でトークンの値を入力します。PAMでは複数要素によるパスワード入力が可能なためこのようなことができますが、FreeIPAのWeb UIへのログインなど、入力欄が1つしかないソフトウェアでパスワードを入力する必要がある場合は、パスワードとOTPをそのまま繋げた文字列を入力します。

実はFirst Factorのプロンプトに繋げた文字列を入力して、Second Factorは空文字列を入力しても認証は行えます。では、なぜこのように分割して入力するのでしょうか?

SSSDのデフォルトではノートPCなどでの利用を考慮して、FreeIPAへの接続がなく、かつ過去に認証に成功しているユーザの場合にはパスワードだけで認証を成功させます。この動作を実現するため、SSSDは認証が成功した時にパスワードのSSHA256の値を生成してキャッシュに蓄積します。入力が2つに分割されていないとどこまでがパスワードでどこからかOTPか確定しない場合があることが理由です。FreeIPAのOTP実装ではトークンの文字数を伝える仕組みがあるため不要ですが、任意のOTP実装と組み合わせられるようになっています。

SSH公開鍵の配布

同一ドメインに所属しているマシン同士でsshする場合にはKerberosによる認証がうまくいきますが、ドメインの外部からclient.example.comにsshするにも、sshの公開鍵をFreeIPAサーバに登録することでドメイン内のマシンに配布できます。

図6:SSH公開鍵を登録~配布する仕組み

Web UIでユーザの詳細画面内、[Account Settings]→[SSH Public keys]で[Add]をクリックすると入力ボックスが表示され、そこへ登録したい公開鍵(~/.ssh/id_rsa.pub など)の内容をコピー&ペーストします。

この状態で以下のようにsshすると、ホストのfingerprintの確認のみでログインできます。FreeIPAのDNS機能まで構成すると(接続元sshクライアントの 設定によりますが)fingerprintの確認もDNS SSHFPレコードで行われて不要になります。

$ ssh client.example.com -l kmoriwak
The authenticity of host 'client.example.com (192.168.122.2)' can't be established.
ECDSA key fingerprint is SHA256:4+k4cLbeLOiVUBWBdiGUMMDiwfqgD0Il1w3crRoBo64.
ECDSA key fingerprint is MD5:b0:10:a0:c7:dd:0f:b5:a9:28:d1:06:3c:e9:5a:6e:22.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'client.example.com' (ECDSA) to the list of known hosts.
Last login: Sun Dec 17 18:49:03 2017
[kmoriwak@client ~]$

おわりに

今回は、FreeIPAをインストールし、その多くの機能の一部を紹介しました。最後に、FreeIPAをもっと知りたくなった場合に便利な関連資料を示します。

FreeIPA Workshop(英語)
FreeIPAの基本的な操作を試すワークショップ教材。vagrantベースなので環境構築が簡単です。

FreeIPAプロジェクト(英語)
「FreeIPA public demo」というページで動作しているデモ環境を公開しています。このデモ環境は毎日削除されるので、自由に使って壊しても問題ありません。とりあえずWeb UIを試してみたい人にはこちらがお勧め。

「Linux ドメイン ID、認証、およびポリシーガイド」
RHEL7のドキュメントの一部として提供されているFreeIPAのドキュメント。かなりの分量ですが導入の前提条件から利用方法、運用方法、トラブルシュートまで幅広く扱っています。

レッドハット株式会社 ソリューションアーキテクト
2007年入社。Xen、KVMの普及に力を入れたのちファイルシステムやSELinux、FreeIPA, Performance Co-Pilotなどに手を出している。『塩漬け』と言いつつ放置されているだけの危険なRHELシステムを見ると胃に悪いので、最新版Androidを強制的に配布できるGoogle様がうらやましい今日このごろ。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています