このブログは IBM Cloud アドベントカレンダー 2020 13日目にエントリーしています。


IBM Cloud が提供している多要素認証サービスである IBM Security Verify for Workforce IAM を使う機会がありました。簡単に各種多要素認証を実装できるサービスだったので、備忘録の意味でもまとめてみました。

【IBM Security Verify for Workforce IAM で実現できる多要素認証の種類】
まず、このサービスを有効にすることで利用できる多要素認証の要素は以下の4種類あります:
(1) ワンタイムパスワード
(2) 確認タップ
(3) SMS
(4) メール


(1) と (2) はスマホに専用アプリ(IBM Security Verify)をインストールすることで利用可能になります。(1) は同アプリ内に表示されているワンタイムパスワードを制限時間内に入力することで確認するもの、(2) は同アプリ内に通知される確認メッセージに対して「承認」のタップを行うことで確認されます。「入力の手間がない」という点ではこの (2) が最も楽な要素といえると感じています。 また (3) はスマホへの SMS に送信されたワンタイムパスワードを入力するもの、(4) は指定したメールアドレスへ送信されたワンタイムパスワードを入力するものです。(3) と (4) は専用アプリを必要としないため、古いスマホやスマホ以外の電話機でも利用可能です(メールに関しては電話機である必要もありません)。



【IBM Security Verify for Workforce IAM を使った多要素認証】
実際に多要素認証を実現するまでの大きな流れとしては、以下の2段階となります:
1. 多要素認証サービスに登録する
2. 各種ログイン時に 1. のサービスが有効になるよう設定する



少し細かく紹介すると、1. はサービスへサインインすることに加えて、多要素認証で利用する手法を登録します。具体的にはメール、電話、SMSそしてスマホ向けの専用アプリです。一般的に多要素認証で使われるのはメール、電話、SMS でコードを知らせて入力させる、という方法ですが、最後の専用アプリを使うとプッシュで知らされる通知に「承認」タップをするだけで認証が完了します。2段階目の手続きが一番楽になる方法でもあります。

2. は 1. で登録した多要素認証サービスを「どの」認証の際に使うか、という設定です。今回のブログでは
 (1) Windows へのログイン時
 (2) Linux 等への SSH ログイン時

の2種類それぞれで使う場合の設定手順を紹介します。


【IBM Security Verify for Workforce IAM の無料評価版に登録】
まずは上記 1. のサービス登録部分を行います。

IBM Security Verify for Workforce IAM のページへ行き、「無料評価版を試す」というボタンをクリックします:
https://www.ibm.com/jp-ja/products/verify-for-workforce-iam

2020103001



IBM ID でのログインが求められるのでログインします。その後、テナントサーバーのホスト名の入力が促されるので、ユニークな(他の人が使ってなさそうな)文字列を入力して "Create tenant" ボタンをクリックします。基本的に作業はこれだけです:
2020103002


試用アカウントの作成等、色々準備が進んでいくので少し待ちます:
2020103003


1~2分程度で「ようこそ」画面が表示されます。使用条件同意にチェックを入れて「続行」:
2020103004


すると IBM Security Verify のダッシュボード画面が表示されます。これで IBM Security Verify のアカウントが作成できました:
2020103005



【IBM Security Verify for Workforce IAM に API client を登録】
サービスへのサインアップはこれだけで完了です。次に各種クライアントからこのサービスを利用できるよう、IBM Security Verify for Workforce IAM に API client を登録します。左上のハンバーガーメニューから "Configuration" を選択します:
2020112601



Configuration の "API access" タブを選択し、"Add API client" ボタンをクリックします:
2020112602


API Client を追加するダイアログが表示されます。まず適当な名前(例 MFA-Client)を入力して、Enabled がチェックされていることを確認します(まだ Save を押さずに下にスクロールします):
2020112603


そのまま下にスクロールして、Access 欄で以下の4つにチェックを入れ、最後に Save をクリックします:
- Authenticate any user
- Read authenticator registrations for all users
- Read second-factor authentication enrollment for all users
- Read users and groups

2020112604


1つ前の画面に戻り、作成した API client が一覧に表示されていることを確認します。この一覧の右側に EDIT ボタンがあるのでここをクリックします:
2020112605


クリックすると、この API client の Client ID と Client secret を確認することができます。後ほど使うのでメモしておきます:
2020112606


【IBM Security Verify for Workforce IAM にユーザーを登録】
次に IBM Security Verify for Workforce IAM に2要素認証を行うユーザーを登録します。左上のハンバーガーメニューから "Users & groups" を選択します:
2020112607


まだユーザーが登録されていない初回は最初にユーザー登録ダイアログが表示されます。以下を指定して(他は適当に指定して)Save をクリックします:
- Identity source : Cloud Directory
- user name : (これから作成するユーザーのログイン時のユーザー名)
- Work e-mail : (これから作成するユーザーのメールアドレス、この後ここにメールが送信される)
- Mobile number: (これから作成するユーザーの携帯電話番号、日本の携帯電話であれば +81 を付け、更に最初の 0 を消して登録する。このあと SMS 認証で利用する)

2020112608


ここまで完了したら(次に新規ユーザーでサインインできるよう)このアカウントではいったんサインアウトします。画面右上のアイコンから "Sign out" を選択します:
2020112609


サインアウトできました:
2020112610



【IBM Security Verify for Workforce IAM にユーザーのデバイス(スマホ)を登録】
ここからは登録されたユーザーによる作業となります。

先ほどユーザー作成時に指定したメールアドレスの受信ボックスを確認してください。IBM Security から Account created というサブジェクトのメールが送信されているはずです。その中に user name で指定したログイン名と初期パスワードが表示されています。下の URL をクリックしてログインします:
2020112611


ログイン画面が表示されたら、メールに記載されていた user name と password を指定してログインします:
2020112612


最初の1回目は初期パスワードから別のパスワードへ変更する必要があるので、自分で管理できるパスワードに変更してください:
2020112613


全て完了すると登録したユーザーで IBM Security Verify にログインします:
2020112614


次のこのユーザーのスマートフォンと、認証デバイスを登録します。画面右上のアイコンをクリックして、"Profile & settings" を選択します:
2020112615


まず登録したユーザー情報のメールアドレスや電話番号が正しいものかどうかをを確認するための画面が表示されます。確認方法は選択できますが、今回は SMS(Text message) を使って確認することにします。"Text message" の横にある "Send code" をクリックします:
2020112616


すると登録時に指定した電話番号に SMS でコードが届きます。そのコードを認証画面内に登録して Submit します:
2020112617


正しいコードを入力することができると携帯電話の登録が完了します。一応これだけでも利用できるのですが、専用アプリを登録しておくと2段階認証時の手続きが簡単になるので、続けて専用アプリを登録しておきます。"Add new method" と書かれた箇所をクリックします:
2020112618


登録するデバイスを選択する画面になります。ここでは IBM Verify app 横の "Add device" をクリックします:
2020112619


スマートフォンに "IBM Verify" アプリケーションをインストールするよう求められます。App Store や Google Play から "IBM Verify" を検索してアプリをインストールしてください。インストールできたら "Connect your account" を選択します:
2020110404


画面に QR コードが表示されます。この QR コードをスマホにインストールした IBM Verify を開いて Q読み取ります:
2020110405


デバイスが登録されますが、まだ "Unauthorized" という扱いになっています。アプリケーションの認証コードを入力してこのアプリケーションとデバイスを認証します:
2020110406


成功するとこのような画面になります:
2020110407


"Authentication app" として表示されていれば成功です:
2020110408



ここまでの作業で上記 1. の多要素認証サービスへの登録作業が完了しました。

ここから下は 2. の作業になります。実際に多要素認証を利用する認証方法ごとに行います。



【Windows へのログイン時に多要素認証を行う場合】
Windows へのログイン時に多要素認証を行う場合の作業手順を説明します。
そのための作業として、対象の Windows PC に IBM Security Verify for Windows Login という Windows アプリケーションを導入します。

まず IBM Security Verify for Windows Login の動作に必要な VSVC++ ランタイムをダウンロードしてインストールします:
https://support.microsoft.com/ja-jp/help/2977003/the-latest-supported-visual-c-downloads

2020113002



続いて以下から IBM Security Verify Gateway for Windows Login をダウンロードします:
https://exchange.xforce.ibmcloud.com/hub/IdentityandAccess

2020113001


ダウンロードしたファイルを展開し、setup.exe を実行してインストールします:
2020113003


インストール後、C:\Program Files\IBM\WindowsLogin\ フォルダ以下にある config.json.sample ファイルをテキストエディタで開きます:
2020113004


以下の内容で書き換え、config.json という名前で保存します:
{
    "ibm-auth-api":{
        "client-id":"********",
        "obf-client-secret":"XXXXXXXXXXXX", /* See obfuscate.exe tool. */
        "protocol":"https",
        "host":"xxxxxxx.verify.ibm.com",
        "port":443,
        "max-handles":16
    },
    "credential-provider":{
        "username-format":"%U",
        /*"trace-file":"c:/tmp/credprov.log", */
        "disable-builtin-password-logon": false,
        "no-mfa-account": "XXXXXXXX\\Administrator",
        "auth-method":"winpwd-then-choice-then-otp"
    }
}

上記を編集する際の注意点があります。

まず client-id には上述の作業で API client を登録した際に取得した Client ID の値をそのまま入力します。

obf-client-secret の値は少し手順が必要です。config.json.sample と同じフォルダに obfuscate.exe というコマンドラインツールがあります。コマンドプロンプトを開いて、以下のコマンドを実行します:
> obfuscate (API client を登録した際に取得した Client Secret の値)

この実行結果として表示される内容を上記 obf-client-secret の値として入力してください(Client Secret の値をそのまま入力するわけではない点に注意してください)。

そして host は IBM Security Verify for Workforce IAM サインアップ時に指定した tenantId を使った "{tenantId}.verify.ibm.com" という値を指定します。

更に username-format の値には "%U" を、no-mfa-account の値にはこの Windows PC の名前(XXXXXXX)を使って "XXXXXXX\\Administrator" と指定してください(最後の設定により Administrator アカウントのみ多段階認証が無効になります)。


最後にこのファイルを同じフォルダ内に config.json という名前で保存すれば準備完了です。

では実際に Windows で多要素認証が有効になっているかどうかを確認します。Windows のログイン画面で Administrator アカウント以外のユーザーを指定します。するとパスワード入力画面に "Sign-in options" というメニューが現れます:
2020120601


同部分をタップして開き、盾のようなアイコンを選択します(選択されていることを確認します):
2020120602


この状態でまずは普通にログインパスワードを入力します:
2020120603


すると2要素目の認証方法を聞かれます。どれを選択してもいいのですが、ここではメールアドレスを選択してみます:
2020120604


すると登録したメールアドレスに IBM Security からメールが届きます。その中にワンタイムパスワードが含まれています:
2020120605


メール内のパスワードをログイン画面に入力して再度 submit します:
2020120606


2要素認証を経て Windows にログインできました:
2020120607



【Linux への SSH ログイン時に多要素認証を行う場合】
Linux へ SSH でログインして作業する機会は珍しくないと思いますが、そのログインを2要素認証にすることも可能です。その手順を紹介します。なおここでは Linux 向け手順を紹介しますが、同様にして AIX 版を利用することで AIX へ適用することも可能です。

前提として、上述の 1. の手続き(IBM Security Verify for Workforce IAM へのサインアップとユーザー&デバイスの登録)まで済ませておきます。また今回の作業を行う対象となる Linux サーバーを用意します(SSH 可能な状態でセットアップします)。

続いて以下から IBM Security Verify Gateway for Linux PAM をダウンロードします:
https://exchange.xforce.ibmcloud.com/hub/IdentityandAccess

2020120608


対象の Linux に root でログインし、以下の手順でパッケージを展開し、インストールします:
# unzip IBMSecurityVerifyGatewayForLinuxPAM_v1.0.3.zip

# cd IBMSecurityVerifyGatewayForLinuxPAM_v1.0.3

# unzip centos7.zip (CentOS 7 or 8 の場合)

# rpm -ivh *.rpm

同パッケージが正しく動作するようデーモンを設定します。vi などのテキストエディタで /etc/pam_ibm_auth.json を編集します:
{
  "ibm-auth-api": {
    "client-id": "********",
    "obf-client-secret": "XXXXXXXXXXXX",
    "protocol": "https",
    "host": "xxxxxxx.verify.ibm.com",
    "port": 443,
    "authd-port": 12,
    "max-handles": "16"
  },
    :
}

↑具体的には上述の IBM Security Verify for Windows Login で指定したものと同様の設定を指定して保存します。

設定ファイルを編集したらデーモンを有効にします:
# systemctl enable ibm_authd_64.service --now

この後で ssh による多段階認証を有効にしますが、「設定が間違っていて、修正したいけど誰もログインできなくなった」という状態を避けるために多段階認証を適用しないユーザーも必要です。今回は root ユーザーは多段階認証なしにログインできるよう設定しておく例を紹介します:
# groupadd -r nomfa

# usermod -aG nomfa root

では sshd の設定も変更して、SSH 時の2段階認証を有効にします。まず /etc/pam.d/password-auth ファイルを /etc/pam.d/civ-auth-choice というファイルにコピーし、その上で /etc/pam.d/civ-auth-choice ファイルを編集します:
  :
  :
auth    requisite    pam_unix.so nullok try_first_pass
auth    sufficient   pam_ibm_auth.so auth_method=choice-then-otp exempt_group=nomfa
add_devices_to_choice transients_in_choice failmode_insecure accept_on_missing_auth_method
  :
  :

まず pam_unix.so を参照している auth から始まる行を探します。そして2列目の sufficient を requisite に変更します。そしてその直下に1行追加し、"auth    sufficient   pam_ibm_auth.so auth_method=choice-then-otp exempt_group=nomfa add_devices_to_choice transients_in_choice failmode_insecure accept_on_missing_auth_method " という行を追加して保存します。

続いて /etc/ssh/sshd_config ファイルを編集し、ChallengeResponseAuthentication で始まる行を探して、その値を yes に変更します(コメントされていたらコメントアウトします):
  :
  :
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication yes
  :
  :

この後で sshd を再起動します:
# systemctl restart sshd

sshd のプロセスは SELinux で守られていて、特定のポートを通じてのみアクセスできます。この部分も変更する必要があります:
# semanage port -a -t kerberos_port_t -p tcp 12

最後に PAM の設定をこれまでの作業内容を参照するよう変更します。/etc/pam.d/sshd を以下のように変更します:
#%PAM-1.0
auth  required  pam_sepermit.so
auth  substack  civ-auth-choice
auth  include   postlogin
  :
  :

↑"auth substack" で始まる行を探して、3列目の値を "password-auth" から "civ-auth-choice" に変更して保存します。

これで SSH の2段階認証が有効になっているはずです。動作確認のため以下のコマンドで(localhost で)SSH ログインしてみます(username 部分には存在するユーザーの名前を指定してください):
# ssh username@localhost

上述の Windows の時と同様に、パスワードを聞かれた後に2段階目の認証方法を聞かれます:
2020120601


今回は1番を選択した例を紹介します。上述の IBM Verify アプリをスマホに導入している場合に使うことができる選択肢です。1を入力すると OTP(ワンタイムパスワード)を聞かれます:
2020120602


この時点で登録したデバイスの IBM Verify アプリを起動し、このタイミングでのアクセスコード(ワンタイムパスワード)を確認します:
2020120605


表示されている有効期限内に入力できるようなタイミングを図りつつ、ワンタイムパスワードを入力します:
2020120603


正しく入力できると ssh が成功し、リモートログインが完了します(下図ではプロンプトが # から $ に変わっています):
2020120604


Linux の SSH でも2要素認証が実現できました。


【まとめ】
以上、手順含めての紹介だったこともあり、かなり長い説明になってしまいましたが、これだけの手続きで各種ログインの多要素認証が実現できることがわかりました。しかも90日間の体験版として無料提供されている機能を使って実現できたので、実際に本格導入する前の動作確認まで出来て、かなりお得なサービスであるように感じます。

今回紹介した多要素認証は Windows ログインと Linux (SSH) ログインでした。用語などで慣れないと戸惑う部分があるかもしれませんが、自分が躓いた所を中心に日本語解説資料を作るつもりで紹介しました。ぜひ皆さんにも試していただければと思っています。