SSO; Single Sign-On
一回承認を通れば、他のコンピュータに認証なしでログインできる。
ここでは研究室内のADドメインに参加したwindowsPCに一端ログインすれば、
そこから計算マシンへのログイン認証が不要になる設定を取り上げる。
また研究室内限定のWebコンテンツに、ADドメイン内からのアクセスなら認証不要で、
それ以外からのアクセスの場合は認証をと止める仕組みも取り上げる
* Linuxマシンをmember serverに仕立てる際、sssdによる方法とwinbindによる方法の2つを取り上げた。ここでの対象は前者のsssdです
「net join」でドメインに参加した際、keytabファイルは各マシンに存在する。
SSOを行うにはこのkeytabファイルにサービス記述子がhostとなるサービスプリンシパルの存在が必要となる。
現行のkeytabファイルにサービス記述子がhostであるサービスプリンシパルが存在するかは
「klist -ke <keytabファイル>」にて調べられるが、存在しなければ発行元であるドメインコントローラにて再発行する
[root@c ~]# rm /etc/krb5.n1.keytab
[root@c ~]# /opt/samba/bin/samba-tool domain exportkeytab /etc/krb5.n1.keytab --principal=n1$
[root@c ~]# /opt/samba/bin/samba-tool domain exportkeytab /etc/krb5.n1.keytab --principal=host/n1.sybyl.local
[root@c ~]#
[root@c ~]# klist -ke /etc/krb5.n1.keytab
Keytab name: FILE:/etc/krb5.n1.keytab
KVNO Principal
---- --------------------------------------------------------------------------
1 n1$@SYBYL.LOCAL (des-cbc-crc)
1 n1$@SYBYL.LOCAL (des-cbc-md5)
1 n1$@SYBYL.LOCAL (aes128-cts-hmac-sha1-96)
1 n1$@SYBYL.LOCAL (aes256-cts-hmac-sha1-96)
1 n1$@SYBYL.LOCAL (arcfour-hmac)
1 host/n1.sybyl.local@SYBYL.LOCAL (des-cbc-crc)
1 host/n1.sybyl.local@SYBYL.LOCAL (des-cbc-md5)
1 host/n1.sybyl.local@SYBYL.LOCAL (aes128-cts-hmac-sha1-96)
1 host/n1.sybyl.local@SYBYL.LOCAL (aes256-cts-hmac-sha1-96)
1 host/n1.sybyl.local@SYBYL.LOCAL (arcfour-hmac)
[root@c ~]#
*サービスプリンシパルのサービス記述子(host)は小文字で
このkeytabファイルを再度n1サイトに送り上書きする。
[root@c ~]# scp /etc/krb5.n1.keytab root@n1:/etc
n1サイト側では、この /etc/krb5.n1.keytabを/etc/krb5.keytabにリンクを張る。
*もしくはドメインコントローラからのコピーの際に/etc/krb5.keytabとしてもいいかも
[root@n1 ~]# ln -s /etc/krb5.n1.keytab /etc/krb5.keytab
[root@n1 ~]# ls -l /etc/krb5.keytab
lrwxrwxrwx. 1 root root 19 12月 12 11:03 /etc/krb5.keytab -> /etc/krb5.n1.keytab
[root@n1 ~]#
kerberosサーバはドメインコントローラですよと定義します
[root@n1 ~]# vi /etc/krb5.conf
[libdefaults]
default_realm = SYBYL.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = true
[realms]
SYBYL.LOCAL = {
kdc = c.sybyl.local
admin_server = c.sybyl.local
}
[domain_realm]
.sybyl.local = SYBYL.LOCAL
sybyl.local = SYBYL.LOCAL
[root@n1 ~]#
/etc/ssh/sshd_config の GSSAPIAuthentication と GSSAPICleanupCredentials を有効にして、sshdを再起動する
[root@n1 ~]# egrep "^GSSAPIAuthentication|^GSSAPICleanupCredentials" /etc/ssh/sshd_config
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
[root@n1 ~]#
[root@n1 ~]# systemctl restart sshd
windows端末にGSSAPI対応ターミナルソフトをインストールします。ここでは PuTTY を使用します。
本家様 http://www.chiark.greenend.org.uk/~sgtatham/putty/
ダウンロードページ http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html から
putty.exeをクリックしてダウンロード。
これを例えば C:\Program Files(x86)\PuTTY\ に置く
*putty.exeのショートカットを作成して、C:\Users\Default\Desktopに配置すれば、初回ログイン時にディスクトップにショートカットが配置される
windowsマシンにドメインログインして、PuTTYを起動する
左側のツリーで「Session」を開き、パスワードなしでアクセスしたいLinuxサーバを指定します。
次に、「Connection」->「Data」にて、「Use system username(illya)」を選択します。これでログインユーザでのアクセスとなる。
最後に「Connection」->「SSH」->「Auth」->「GSSAPI」にて「Allow GSSAPI credential delegation」を有効にする。
このように定めた設定を保存します。
左側のツリーの「Session」から「Saved Sessions」として「gssapi_N1」と定義して「Save」ボタンをクリックします。
接続設定名「gssapi_N1」を引き出して、アクセスを試みます。
左側のツリーの「Session」から保存した設定「gssapi_N1」を選び「Load」ボタンをクリックします。
そして、PuTTY画面下部の「Open」ボタンをクリックします。
初回にマシンキーの登録が求められるが「はい」を押します。
すると、パスワードなしでLinuxメンバサーバにログインできる。
上記のままだと、機動の度に接続設定名を再読み込む必要があり面倒です。それを簡略化する方法としてショートカットを作成します。
C:\Program Files(x86)\PuTTY\ に配置したPuTTY.exeのショートカットをディスクトップらに作ります。
作ったショートカットの「プロパティ」を開いて、「リンク先」入力欄のPuTTY.exeに保存したセッション名を引数として加えます。
"C:\Program Files (x86)\PuTTY\putty.exe" -load gssapi_N1
「作業フォルダ」入力欄は、そのままでもいいが、ホームディレクトリ(%HOMEPATH%)でも宜しいかと。
これで、このショートカットをダブルクリックすれば、パスワードの入力なしに、Linuxメンバサーバにアクセスできます。
*なのでこのショートカットの名称を N1 とかマシン名にすればいいのかな
留意 設定が完了したら[save]する事。しないとその場限りです。
経路的には windowsPC --> LinuxA --> LinuxB へとパスワードなしで渡り歩きたい。
Hostbase認証やら .ssh/authorized_keys 方式を施せば、パスワード認証なしで LinuxA --> LinuxB は行けます。
ここでは、これらの方法を使わず、あくまでも sso 経由で行きたい場合を記す
ssh先となるサーバ側の設定は前述のとおり/etc/krb5.keytab、/etc/ssh/sshd_configそれと/etc/krb5.confの調整を済ませておく。
ssh接続を行うクライアント側では /etc/ssh/ssh_config もしくは .ssh/ssh_config に下記のようにする
Host *
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
こうすれば、 LinuxA --> LinuxB もsso経由で渡り歩ける
windowsPC(出発点, windows login) --> LinuxA において、
当然なのだが、Ticketがないと、そのままでは次へ(-->LinuxB)にパスワードなしログインは出来ない。
「kinit」を実行してTicketを用意する必要がある
ホストベース接続も有効にしていると、ssoでログインできたのか確認が難しい。「-v」を付与して実行すればわかるのだが、、
もっと明示的に確認するにはsshに「-o」を付与して接続を試みる
(チケットを破棄する)
[illya@n1 ~]$ kdestroy
kdestroy: No credentials cache found while destroying cache
(破棄の確認)
[illya@n1 ~]$ klist
klist: No credentials cache found (filename: /tmp/krb5cc_1002)
(チケットを取得)
[illya@n1 ~]$ kinit
Password for illya@SYBYL.LOCAL:
(取得したチケットの確認)
[illya@n1 ~]$ klist
Ticket cache: FILE:/tmp/krb5cc_1002
Default principal: illya@SYBYL.LOCAL
Valid starting Expires Service principal
2017-07-09T18:14:03 2017-07-10T04:14:03 krbtgt/SYBYL.LOCAL@SYBYL.LOCAL
renew until 2017-07-16T18:14:00
[illya@n1 ~]$
[illya@c ~]$ ssh -o HostbasedAuthentication=no -o GSSAPIAuthentication=yes n1 -v
:
debug1: Authentication succeeded (gssapi-with-mic).
:
Last login: Sun Jul 9 18:13:41 2017 from c.sybyl.local
[illya@n1 ~]$
「Authentication succeeded (gssapi-with-mic)」とあれば、チケットを使ってssoがうまく行った
ホストベースでの接続を確認するには
[illya@c ~]$ ssh -o HostbasedAuthentication=yes -o GSSAPIAuthentication=no n1 -v
:
debug1: Authentication succeeded (hostbased).
:
Last login: Sun Jul 9 18:18:33 2017 from c.sybyl.local
[illya@n1 ~]$
と「Authentication succeeded (hostbased)」と表記される