これは、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
, password
はstnsd.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管理にも向いています。