Edited at

期待のSSH認証方式「STNS」を試す

More than 1 year has passed since last update.

これは、2016年のアドベントカレンダーを書く時間がなかったときの、逃げ道に用意してあった記事です。

すっかりアップロードを忘れていました。

そのため、手元のタイムスタンプでは 2016/12/08最終更新 となってますのでご注意ください。


はじめに

Linuxのユーザー管理にLDAPを使うのにうんざりしている人、いますよね。

RDB系と違って癖があるので、説明するのも大変だったりします。

STNSはそんな方々にとって理想的な代替手段になりそうなOSSです。


セットアップしてみる

上記の通り、この手順は 2016年12月頃に検証したログ です。

本手順を鵜呑みにせず、 必ず最新の情報を確認してからセットアップしてください。

試験環境はCentOS6です。


インストール

インストール手順に従ってyumリポジトリが公開されています。

それを使用する場合はこちら。

### バグがあると嫌なので、一応確認しておきましょう

$ curl -fsSL https://repo.stns.jp/scripts/yum-repo.sh

### インストール
$ curl -fsSL https://repo.stns.jp/scripts/yum-repo.sh | sh
$ yum install stns libnss-stns libpam-stns nscd

ログイン周りということで、用意されたyumリポジトリを使用することすら嫌かもしれません。

多少安心できるという意味で、GitHubのReleaseを利用するインストール方法も書いておきます。

※ 現在のバージョンは確認してください。

$ yum localinstall -y https://github.com/STNS/STNS/releases/download/v0.3-1/stns-0.3-1.x86_64.rpm

$ yum localinstall -y https://github.com/STNS/libnss_stns/releases/download/v0.3-1/libnss-stns-0.3-1.x86_64.rpm https://github.com/STNS/libnss_stns/releases/download/v0.3-1/libpam-stns-0.3-1.x86_64.rpm
$ yum install -y nscd

それすら不安なら、ビルドしましょう。


stnsdの設定


stnsd本体の設定

まず大元のstnsd設定を作ります。

$ vim /etc/stns/stns.conf

port = 1104
include = "/etc/stns/*.d/*"
user = "stns_user"
password = "適当な乱数にしておく"

上記例ではincludeをワイルドカードで指定しています。これは後で役に立ちます。


ユーザー設定

続いてユーザーおよびグループの情報を設定に追加しましょう。

上記includeで複数ディレクトリに対応する書式にしているので、ユーザーとグループでそれぞれディレクトリを作って管理することができます。


設定ディレクトリ作成

$ mkdir /etc/stns/users.d /etc/stns/groups.d


メンテしやすいように、グループ毎に設定ファイルを作ります。


グループ設定ファイル作成

$ vim /etc/stns/groups.d/1000_testgroup.conf

[groups.testgroup]
id = 1000


ユーザーもユーザー毎に設定ファイルを作ることが出来ます。

予め公開鍵を用意しておき、下記のkeysに入れましょう。


ユーザー設定ファイル作成

$ vim /etc/stns/users.d/1001_test.user.conf

[users."test.user"]
id = 1001
group_id = 1000
shell = "/bin/bash"
directory = "/home/test.user"
keys = ["ssh-rsa xxxx..."]



PAMおよびsshdの設定


PAM認証の設定

PAMで使えるようにする設定を入れます。

LDAPなどの他の認証を使用している環境なら、 STNS認証->LDAP認証みたいなフォールバック も設定できます。(この設計が素晴らしい)

ただし、ここでは割愛。

user, passwordstnsd.confに書いたものと同一にします。

$ vim /etc/stns/libnss_stns.conf

api_end_point = ["http://127.0.0.1:1104/v2"]
user = "stns_user"
password = "xxxx"
wrapper_path = "/usr/local/bin/stns-query-wrapper"
request_timeout = 3

動作確認。ユーザー情報が取れればOK。

$ /usr/local/bin/stns-query-wrapper /user/name/test.user

{"min_id":1001,"items":{"test.user":{"id":1001,"password":"","group_id":1000,"directory":"/home/test.user","shell":"/bin/bash","gecos":"","keys":["ssh-rsa xxxx...."],"link_users":null}}}

続いてログイン時に、ローカルユーザーを確認してからSTNS認証に進むように設定します。

$ vim /etc/nsswitch.conf

passwd: files stns
shadow: files stns
group: files stns


認証情報キャッシュの設定

認証情報はnscdを使ってpasswdとgroup情報をキャッシュしておいたほうが良い(stnsdのメンテ時とかに便利)ので、設定を変えておきます。

細かいパラメータはマニュアルを見ながら調整するのが良いので割愛。

$ vim /etc/nscd.conf

enable-cache passwd yes
enable-cache group yes

### 適用する
$ service nscd reload


各種設定の連携確認

ここまでで一度動作確認しておきましょう。

うまくいかない時はselinuxを疑う。 (一度ハマった)

$ id test.user

uid=1001(test.user) gid=1000(testgroup) 所属グループ=1000(testgroup)


sshd設定

sshdの設定値は環境によって様々だと思うので、ポイントとなる3行の設定値だけ記載します。

$ vim /etc/ssh/sshd_config

PubkeyAuthentication yes
AuthorizedKeysCommand /usr/lib/stns/stns-key-wrapper
AuthorizedKeysCommandRunAs root

AuthorizedKeysCommandRunAsは、sshdのバージョンによってはAuthorizedKeysCommandUserに名前が変わっているはずなので注意。

余談だが、RunAsをroot以外にしたらうまく動作しなかった。


ホームディレクトリ自動生成の設定

sshdでログインしたときにホームディレクトリが自動的に生成されるように、PAMに設定を仕込みます。

細かい説明は割愛しますが、検証した環境のsshdのPAM設定のsession(ざっくりいうと、認証後に実行される処理)ではpassword-authを呼び出しています。それを確認します。

(この辺はシステムによって異なる可能性があるのでちゃんとチェックした方が良いです)

$ grep session /etc/pam.d/sshd

# 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

上記でincludeされているpassword-authにホームディレクトリ自動作成を設定します。

$ vim /etc/pam.d/password-auth

### 追記する
session optional pam_mkhomedir.so umask=0077

これで準備完了です。


動作確認

他のマシンからsshで公開鍵ログインを試しましょう。


最後に

STNSは、SSHの公開鍵ログイン用の設定を非常に簡単に設定できるのが魅力的です。

ファイル単位の管理は、Ansibleなどのプロビジョニングツールとも相性がよく、Git管理にも向いています。