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


これは、[2016年のアドベントカレンダー](http://qiita.com/Ets/items/8a6bb318558a2680754f)を書く時間がなかったときの、逃げ道に用意してあった記事です。
すっかりアップロードを忘れていました。

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

# はじめに
Linuxのユーザー管理にLDAPを使うのにうんざりしている人、いますよね。
RDB系と違って癖があるので、説明するのも大変だったりします。

[STNS](http://stns.jp/)はそんな方々にとって理想的な代替手段になりそうなOSSです。


# セットアップしてみる
上記の通り、この手順は **2016年12月頃に検証したログ** です。
本手順を鵜呑みにせず、 **必ず最新の情報を確認してからセットアップしてください。**

試験環境は`CentOS6`です。

## インストール
インストール手順に従ってyumリポジトリが公開されています。
それを使用する場合はこちら。

```bash
### バグがあると嫌なので、一応確認しておきましょう
$ 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`で複数ディレクトリに対応する書式にしているので、ユーザーとグループでそれぞれディレクトリを作って管理することができます。

```bash:設定ディレクトリ作成
$ mkdir /etc/stns/users.d /etc/stns/groups.d
```

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

```bash:グループ設定ファイル作成
$ vim /etc/stns/groups.d/1000_testgroup.conf

[groups.testgroup]
id = 1000
```

ユーザーもユーザー毎に設定ファイルを作ることが出来ます。
予め公開鍵を用意しておき、下記の`keys`に入れましょう。

```bash:ユーザー設定ファイル作成
$ 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`, `password`は`stnsd.conf`に書いたものと同一にします。

```bash
$ 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。

```bash
$ /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認証に進むように設定します。

```bash
$ vim /etc/nsswitch.conf

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


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

認証情報は`nscd`を使ってpasswdとgroup情報をキャッシュしておいたほうが良い(stnsdのメンテ時とかに便利)ので、設定を変えておきます。
細かいパラメータはマニュアルを見ながら調整するのが良いので割愛。

```bash
$ vim /etc/nscd.conf

enable-cache            passwd          yes
enable-cache            group           yes


### 適用する
$ service nscd reload
```

## 各種設定の連携確認

ここまでで一度動作確認しておきましょう。
**うまくいかない時はselinuxを疑う。** (一度ハマった）

```bash
$ id test.user

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

## sshd設定

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

```bash
$ 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`を呼び出しています。それを確認します。
(この辺はシステムによって異なる可能性があるのでちゃんとチェックした方が良いです)

```bash
$ 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`にホームディレクトリ自動作成を設定します。

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

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

これで準備完了です。


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

# 最後に
STNSは、SSHの公開鍵ログイン用の設定を非常に簡単に設定できるのが魅力的です。
ファイル単位の管理は、Ansibleなどのプロビジョニングツールとも相性がよく、Git管理にも向いています。