最新 追記

雑記帳


2014-10-01 (Wed) [長年日記]

[Linux] sshでGSSAPIを使ったシングルサインオン(SSO)

Linuxで、Active Direcotryを使った認証ができるようになったので、次はsshのシングルサインオン(SSO)をやってみた。

認証基盤の構成は、以前のエントリ RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (2)を参照のこと。

サーバの設定

sshdでGSSAPIを使うには、GSSAPIAuthenticationをyesにする。デフォルトでは有効になっているはず。 また、AuthenticationMethodsに、gssapi-keyex, gssapi-with-micを追加する。これまでの設定で、keyboard-interactiveのみになっていたので、追加すると、下記のようになる。

AuthenticationMethods gssapi-keyex gssapi-with-mic keyboard-interactive

設定が追記できたら、sshd -tで確認の上、sshdを再起動する。

DNSの設定

Linuxのホストの場合、Active Directoryに登録しただけでは自動的にDNSにレコードが登録されていない可能性がある。その場合は、GSSAPIを使った認証が失敗してしまう(Kerberosは名前がとても重要なのだ)。そのため、きちんと名前解決ができるようにDNSの設定をする。正引きだけでなく、逆引きについても登録が必要となる。

せっかくなので、PowerShellで登録してみた。

PS> Add-DnsServerResourceRecordA -ZoneName example.local -IPV4Address 10.0.128.195 -Name server01
PS> Add-DnsServerResourceRecordPtr -ZoneName 0.10.in-addr.arpa -Name 195.128 -PTRDomainName server01.example.local

クライアントの設定

今回の対象はOS X(10.9.5)とする。

コンピュータ名の変更

Active Directoryのドメインに参加させる必要があるので、その準備として、ホスト名を適切なものに変更する。

% sudo scutil --set HostName test01.example.local
% sudo hostname test01
ドメインへの参加

MacをActive Directoryのドメインに参加させる。

% dsconfigad -add example.local -username <domain_administrator>

時間が掛かるので、少し待つ。問題なければなにも出力されないはず。 これで、ADのアカウントでMacにログインできるようになる。

ADアカウントでログイン

Macに対して、ADアカウントでログインした状態で、sshでサーバにログインする。 その際、GSSAPIAuthentication=yesを指定する(または、~/.ssh/configに設定を追記する)。

$ ssh -v -o GSSAPIAuthentication=yes isobe@server01.example.local
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: Connecting to server01.example.local [10.0.128.195] port 22.
debug1: Connection established.
(snip)
debug1: Authentications that can continue: gssapi-keyex,gssapi-with-mic,keyboard-interactive
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug1: Next authentication method: gssapi-with-mic
debug1: Authentication succeeded (gssapi-with-mic).
Authenticated to server01.example.local ([10.0.128.195]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = ja_JP.UTF-8
Last login: Wed Oct 1 20:39:04 2014 from test01.example.local
[isobe@server01 ~]$

GSSAPIを使ってログインしていることを示すため、-vオプションを付与して、debug1ログを出力している。"Authentication succeeded (gssapi-with-mic)."と出力されている通り、GSSAPIを使って認証が成功している。

これで、パスワードや公開鍵を使わずにログインすることができた。

ちなみに、GSSAPIが使えない場合は、前回までの設定のとおり、パスワードとワンタイムパスワードの認証が有効になる。

[Linux] GSSAPIとGoogle Authenticatorを連動させる

GSSAPIを使って、認証情報をユーザが入力せずにログインできるようになったのだが、天から声が聞こえてきた。

サーバにログインするためには、必ずどこかでワンタイムパスワードを必須にせよ。

むむ。そうすると、Macにログインするときに、ワンタイムパスワードを使うことはできないので、サーバにログインするタイミングで必須にしないといけない。

ということで、sshdの設定を下記のように変更した。

/etc/pam.d/sshd

以前は、auth substackとして、password-authを入れていたのだが、それを削除する。

#%PAM-1.0
auth	   required	pam_sepermit.so
auth       substack     google-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    optional     pam_keyinit.so force revoke
session    include      password-auth
session    include      postlogin

/etc/ssh/sshd_config

前回は、gssapi-with-micまたはkeyboard-interactiveとしていたが、gssapi-with-micおよびkeyboard-interactiveと変更する。

AuthenticationMethods gssapi-with-mic,keyboard-interactive

この設定でログインしてみよう。

$ ssh -v -o GSSAPIAuthentication=yes isobe@server01.example.local
Authenticated with partial success.
Verification code:
Last login: Wed Oct 1 22:10:08 2014 from test01.example.local
[isobe@server01 ~]$

最初に"Authenticated with partial success."と出力されているのが、GSSAPIで認証の一部が成功していることを表している。その後、"Verification code:"の箇所で、ワンタイムパスワードを入力して成功すると、ログインできる。


2014-10-03 (Fri) [長年日記]

[Mac] ローカルアカウントの設定をADアカウントに移行する

MacがActive Directoryのアカウントでログインできるようになった。

ADのアカウントとローカルアカウントは別のものになるので、これまでローカルアカウントで使ってきた設定などを、最初からやり直さなければならない…と思っていたのだが、実は移す方法があった。

ローカルユーザアカウントをネットワークユーザアカウントに変換する方法

この手順に従うと、全く問題なくローカルアカウントからADアカウントに移行することができる。


2014-10-06 (Mon) [長年日記]

[Windows] Windows 7のローカルアカウントの設定をADアカウントに移行する

前回、ローカルアカウントの設定をADアカウントに移行するでは、Mac OSXのアカウントについて説明したが、Windows 7で同様のことをやるにはどうすればよいのか分からなくて調べてみた。

ユーザプロファイルをコピーすることで移行できるのではないかと思ったのだが、Windows 7ではプロファイルをコピーすることが出来ないようだ。

この記事のコメントに、Windows転送ツールを使えばできるとあったので、実施してみた。具体的な方法については、下記の記事が参考になる。

手順通り実施したら、問題なくコピーできたのだが、Firefoxなどの一部のアプリケーションについては、ユーザの設定情報などが失われてしまっていたので、各アプリケーションの設定については、個別にバックアップとリカバリをしないといけないようだ。


2014-10-15 (Wed) [長年日記]

[Linux] SSHの認証でワンタイムパスワードを使う(ログインするたびに何度も入力するのが嫌な人への対策編)

SSHの認証でワンタイムパスワードを使う(導入編)では、Google AuthenticatorのPAMモジュールを使って、SSHする際にワンタイムパスワードを使うというのを実践した。

また、GSSAPIとGoogle Authenticatorを連動させるでは、SSHする際に、Kerberos認証をした結果をGSSAPIを使ってSSOするようにした。

これによって、ワンタイムパスワードを入力するだけでログインできるようになった。しかし、SSHするたびにワンタイムパスワードを入力するのが面倒である、というフィードバックがあった。例えば、EvernoteやGoogle Appsなどのサービスは、必ずしもワンタイムパスワードを毎回入力する必要がなく、認証情報を記録しておき、一定期間はワンタイムパスワードの入力は不要になる、という仕組みが存在する。ワンタイムパスワードを使うことによってセキュリティを強化しても、使い勝手が悪いと利用されなくなってしまうからだろう。

残念ながら、Google AuthenticatorのPAMモジュール自体に、それに相当する機能は存在しない。別の方法が無いか調べているうちに、pam_timestampというPAMモジュールがあることに気がついた。pam_timestampは、sudoコマンドがパスワードを入力した後、しばらくはパスワードを入力せずとも実行できる仕組みをシミュレートするものという。まさに今回実現したいことが実現できそうだ。

というわけで、/etc/pam.d/sshdに設定してみた。ドキュメントに従って、authとsessionに、pam_timestamp.soを追加している。

#%PAM-1.0
auth required pam_sepermit.so
auth sufficient pam_timestamp.so timestamp_timeout=300
auth substack google-auth
auth include postlogin
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session optional pam_keyinit.so force revoke
session optional pam_timestamp.so
session include password-auth
session include postlogin

この設定の意図は、sshdでgoogle-authenticatorにて認証を行う前に、それより5分以内に認証に成功していれば、再度ワンタイムパスワードの入力は不要になる、というところだ。

ということで、この設定でテストしてみた。

初回のログイン時には、ワンタイムパスワードを入力してログインできた。この際、timestampを記録するファイルが更新されることが分かる。

Oct 15 16:21:34 test sshd[27283]: pam_timestamp(sshd:session): updated timestamp file `/var/run/sudo/root/ssh:isobe'

では、2回目はどうかと思いログインしてみたが、再度ワンタイムパスワードの入力が求められてしまった。どういうことなのか、ログを見てみる。

Oct 15 16:22:19 test sshd[27425]: pam_timestamp(sshd:auth): timestamp file `/var/run/sudo/root/ssh:isobe' is older than oldest login, disallowing access to sshd for user root

oldest loginの時刻とファイルのtimestampを比較して、login時刻よりもtimestampが古いので許可しない、ということのようだ。ソースコードを見てみると、check_login_time関数でそのチェックを行なっているらしい。どうやら、sudoの動きをシミュレートしているからか、ログインをしている状態で利用されることが前提になっているようだ。

少し考えた末、check_login_time関数を無力化すれば、やりたいことができるのではないかと思った。

というわけで、ソースコードを下記のように修正。check_login_timeの中身を削除して、PAM_SUCCESSを返すだけにした。また、デフォルトでtimestampを記録するディレクトリが、/var/run/sudoだったので、/var/run/google-authに変更したり、モジュール名をpam_timestamp_gauthに変更したりしてる。

ということで、これをmakeして出来たpam_timestamp.soを、/var/lib64/security/pam_timestamp_gauth.soにmvして、/etc/pam.d/sshdを、下記のように修正した。timestamp_timeoutは、テスト目的のため、60秒と短くしている。

#%PAM-1.0
auth required pam_sepermit.so
auth sufficient pam_timestamp_gauth.so timestamp_timeout=60 verbose
auth substack google-auth
auth include postlogin
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session optional pam_keyinit.so force revoke
session optional pam_timestamp_gauth.so
session include password-auth
session include postlogin

これで、再度テストしてみる。

% ssh test.example.local
Authenticated with partial success.
Verification code:
Last login: Wed Oct 15 19:14:15 2014 from 192.168.22.96
$ exit
ログアウト
Connection to test.example.local closed.
% ssh test.example.local
Authenticated with partial success.
Access granted (last access was 6 seconds ago).
Last login: Wed Oct 15 21:46:58 2014 from 192.168.22.96
$

おお、"Access granted (last access was 6 seconds ago)."と出力され、ワンタイムパスワードを入力せずともログインできた。ログを見ると、下記のように記録されている。

Oct 15 21:47:04 test sshd[5051]: pam_timestamp_gauth(sshd:auth): timestamp file `/var/run/google-auth/root/ssh:isobe' is only 6 seconds old, allowing access to sshd for user root

そして、設定した時間を越えて、再度ログインすると、通常通り、ワンタイムパスワードの入力が求められる。ログには、下記のように出力される。

Oct 15 21:48:38 test sshd[5185]: pam_timestamp_gauth(sshd:auth): timestamp file `/var/run/google-auth/root/ssh:isobe' has unacceptable age (94 seconds), disallowing access to sshd for user root

timestamp_timeoutの秒数を適切に変更すれば、比較的ストレス無く利用できるようになるだろう。