OneLoginのRADIUSを使ってAWS WorkSpacesのMFAを実現したときに詰まったところ

基本的に以下の２つの記事どおりにやっていけば問題ないのですが、詰まったところがあったので書いておきます。

* [OneLoginを使ってWorkSpacesでMFAをしてみた ｜ DevelopersIO](https://dev.classmethod.jp/etc/onelogin_try_mfa/)	
* [OneLoginのMFAを利用してWorkSpacesの2段階認証を実現する – サーバーワークスエンジニアブログ](http://blog.serverworks.co.jp/tech/2018/02/28/onelogin-workspaces01/)	

## TL;DR

* OneLogin AD Conectorがインストールできない
    * マニュアルの必須要件を確認しよう
    * `AD Domain Service` を事前に入れておこう
* AWS WordspacesのVDIに `ID/PW` では入れるけど `MFA` 有効にすると入れない
    * `radtest` でRADIUSをテストしよう
    * RADIUSにどの属性値を使ってOTPを投げているか確認しよう、確認できなかったら総当たりで

## OneLogin AD Conectorがインストールできない

マニュアルに書いてある必要要件は満たしているはずなのに、インストーラーが先に進まない。

![onelogin_ad_connector_error.png](https://qiita-image-store.s3.amazonaws.com/0/135041/454b5ae7-f9ef-e4ef-ba54-bde3f8118a7d.png)

* [Install & Configure Active Directory Connector 5 \- OneLogin Knowledge Base](https://onelogin.service-now.com/support?id=kb_article&sys_id=47e9d143db109700d5505eea4b961992)	

原因は結構単純で、そもそもWindows Serverに `AD Domain Service` をインストールする前だったので入らなかったようです。
`AD Domain Service` を入れた後に起動したら問題なくインストールできました。

## OneLogin RADIUSにRejectされる

ユーザー同期も問題なく、ID/PWでログインできることは確認できたのですが、MFA有効にしてOTPを送ってもOneLogin RADIUSでRejectされました。

![reject_radius_event_log.png](https://qiita-image-store.s3.amazonaws.com/0/135041/86233ea3-ed23-a701-c24d-9fccc97686f9.png)

PasswordかOTPが正しくないのかと思いましたが、OneLoginの画面には問題なくログインできました。

### FreeRADIUSの出番

今回初めて存在を知って触ったんですが、 `radtest` というコマンドでRADIUSへ問い合わせできます。

* [RADIUS をテストするには \- らくがきちょう](http://sig9.hatenablog.com/entry/2015/12/12/171036)	

OTPは問題ないとしたら、OneLogin RADIUSがなにかおかしいのかなと思い `radtest` から叩いてみました。

* [Configure the RADIUS Server Interface \- OneLogin Knowledge Base](https://onelogin.service-now.com/support?id=kb_article&sys_id=cbd99143db109700d5505eea4b96195d)	

#### インストール

```
# apt-get -y install freeradius
```

#### 疎通できてないときのログ

使っていた環境が1812ポートのOutbound閉じてた。

```
# radtest user password 52.34.255.206 1812 secret
Sending Access-Request of id 174 to 52.34.255.206 port 1812
	User-Name = "user"
	User-Password = "password"
	NAS-IP-Address = 172.17.0.3
	NAS-Port = 1812
	Message-Authenticator = 0x00000000000000000000000000000000
Sending Access-Request of id 174 to 52.34.255.206 port 1812
	User-Name = "user"
	User-Password = "password"
	NAS-IP-Address = 172.17.0.3
	NAS-Port = 1812
	Message-Authenticator = 0x00000000000000000000000000000000
Sending Access-Request of id 174 to 52.34.255.206 port 1812
	User-Name = "user"
	User-Password = "password"
	NAS-IP-Address = 172.17.0.3
	NAS-Port = 1812
	Message-Authenticator = 0x00000000000000000000000000000000
radclient: no response from server for ID 174 socket 3

# traceroute -U -p 1812 52.34.255.206
```

#### 入力値が正しくないときのログ

* OneLogin RADIUS Attribute
    * User-Name
        * `SAMAccountName`
    * User-Password
        * `Password`

OneLogin側でMFA必須となっていたのにOTPを送っておらず、RADIUS側でもOTPを受け取るようにAttributeも設定されていないのでエラーとなった。

```
# radtest user password 52.34.255.206 1812 secret
Sending Access-Request of id 92 to 52.34.255.206 port 1812
	User-Name = "user"
	User-Password = "password"
	NAS-IP-Address = 172.17.0.3
	NAS-Port = 1812
	Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Challenge packet from host 52.34.255.206 port 1812, id=92, length=168
	Reply-Message = "Please enter your one-time password (OTP). If you do not have an OTP, please register an authentication device in your OneLogin user profile."
	State = 0x353535
```

#### MFA必須を外してID/PWだけで試したときのログ

* OneLogin RADIUS Attribute
    * User-Name
        * `SAMAccountName`
    * User-Password
        * `Password`

Access-Acceptとなり成功。

```
# radtest user password 52.34.255.206 1812 secret
Sending Access-Request of id 15 to 52.34.255.206 port 1812
	User-Name = "user"
	User-Password = "password"
	NAS-IP-Address = 172.17.0.3
	NAS-Port = 1812
	Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Accept packet from host 52.34.255.206 port 1812, id=15, length=20
```

#### OTP必須にしてAttributeでOTPを受け取るようにしたときのログ

* OneLogin RADIUS Attribute
    * User-Name
        * `SAMAccountName`
    * User-Password
        * `Password+OTP`

Access-Acceptとなり成功。

```
# radtest user password+OTP 52.34.255.206 1812 secret
Sending Access-Request of id 225 to 52.34.255.206 port 1812
	User-Name = "user"
	User-Password = "password+OTP"
	NAS-IP-Address = 172.17.0.3
	NAS-Port = 1812
	Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Accept packet from host 52.34.255.206 port 1812, id=225, length=20
```

オプションいろいろ盛ってみて再度確認。

```
# radtest -t pap user password+OTP 52.34.255.206 1812 secret 1
Sending Access-Request of id 173 to 52.34.255.206 port 1812
	User-Name = "user"
	User-Password = "password+OTP"
	NAS-IP-Address = 172.17.0.3
	NAS-Port = 1812
	Message-Authenticator = 0x00000000000000000000000000000000
	Framed-Protocol = PPP
rad_recv: Access-Accept packet from host 52.34.255.206 port 1812, id=173, length=32
	Framed-Protocol = PPP
	Framed-Compression = Van-Jacobson-TCP-IP
```

### RADIUSパケット

* [Radius認証とは](https://www.infraexpert.com/study/security20.html)
* [RADIUSとは \-\- Key：雑学事典](http://www.7key.jp/nw/technology/term/server/radius.html)

OneLoginのRADIUSにて、Attributeで設定できる `User-Name` `User-Password` は、RADIUSの属性値ペアの名前だったんですね。
属性値ペアで渡せるものは定義されており、ベンダ特有の属性値を作るのは推奨されていない。
だからOTPを渡すときに `User-Password` を使っているんですね。

### AWSのAD ConnectorはOTPをRADIUSにどう送っているのか

ここまでくるとさすがに原因がわかりました。
OneLogin RADIUSのAttribute設定が、AWSのAD Connectorが送っている値とかみ合っていないことが原因です。
radtest使うまでは `OTP` が専用の項目で来ると思っていたので、`User-Password` の項目は `Password` で設定していました。

AWSのマニュアルを探しても、どう送っているのか見あたらなかったので、ここからは総当たりです。
Attributeの設定には以下の選択項目があります。

* User-Name
    * Email
    * Username
    * Password
    * OTP
    * Password+OTP
    * SAMAccountName
* User-Password
    * Email
    * Username
    * Password
    * OTP
    * Password+OTP
    * SAMAccountName

さすがにUser-Nameの項目を使ってOTPを送ることはないと思うので、候補としてはUser-Password項目の `OTP` `Password+OTP` のどちらかですね。

一応両方試してみましたが、うちの環境ではこのパターンでのみログインできました。

* User-Name
    * `SAMAccountName`
* User-Password
    * `OTP`

#### オチ

ServerWorksさんのブログにキャプチャでRADIUSのAttribute設定が載っていました。見逃していた。。。

## OneLogin RADIUSのIPが変わっているので注意

ここは間違えなかったですが、最初に紹介したブログに書かれているIPだと設定が古いです。

[Configure the RADIUS Server Interface \- OneLogin Knowledge Base](https://onelogin.service-now.com/support?id=kb_article&sys_id=cbd99143db109700d5505eea4b96195d)	

US側なら `radius.us.onelogin.com` `radius2.us.onelogin.com` になります。