STNSサーバーを
書いてみた話
2017.12.6 #m3techtalk
@yteraoka
目次
● 試すきっかけ、モチベーション
● STNS とは何か?
● 作ってみたもの
● セットアップ方法
● demo
● 作ってみた感想
Motivation
● 一箇所のオンプレサーバーだけでなく、複数のクラウドサービスやVPSサー
ビス上にサーバーが散在するようになり、アカウント管理が大変
● LDAP にどこからでもアクセス可能にするのはやりたくない
● STNS という便利なものが公開されていた
https://stns.jp/
Motivation
オンプレサーバー
環境が増え、サーバーが増え、
人が増え・・・・
パトラッシュ・・・
某VPS
某クラウド
Motivation
STNS サーバー
オンプレサーバー
全部一箇所で管理できる
(アクセスできない場合のことも考慮は必要)
某VPS
某クラウド
STNS とは (1)
● Simple TOML Name Service の略
● 公開されているサーバーが TOML ファイルでデータを持っていることに由
来する名前だが便利なのはそこではない
● Linux には統合認証のための仕組みがある
○ PAM (Pluggale Authentication Modules)
○ NSS (Name Service Switch)
● ちょうど良い記事があった
第2回 認証統合の概要[Linux編]http://gihyo.jp/admin/serial/01/ad-
linux2017/0002
STNS とは (2)
● PAM と NSS を使って HTTP(S) の JSON API を使えるようにすれば便利
なのではないかという発想、サーバーの実装が楽
● 作者による紹介記事
Linuxユーザーと公開鍵を統合管理するサーバ&クライアントを書いた
https://ten-snapon.com/archives/1228
● OpenSSH Server には AuthorizedKeysCommand という設定があり、
Public key をここに指定した任意のコマンドで取得することができる
● STNS では STNS サーバーから Public key を取得するコマンドも用意され
ているため、これも一箇所で管理できる
STNS とは (3)
● STNS にはサーバー実装も含まれており、要件が合えばそのまま使える
● JSON を返す HTTP(S) サーバーを書けば自前で必要な機能を実装できる
● Interface
https://stns.jp/en/interface
STNS Server
● TOML ファイルでユーザー、グループ、公開鍵、sudoers 設定
などが行える
● Basic認証、クライアント証明書、任意のヘッダー認証対応
● ただし、どのクライアントサーバーでも同じレスポンスを返すため
サーバーごとにログイン出来る人を管理するということができなかった
● 権限の問題だけならグループでなんとかなるかもしれない
作ってみたもの(プロトタイプ)
● サーバーグループ毎にログイン出来る人を管理する
● サーバーグループの識別は Basic 認証のIDか、クライアント証明書
● Django の Admin App 便利そうだから Django で書いてみた
https://github.com/yteraoka/morion/tree/develop
作ってみたもの
server
server
appXX
server
server
appZZ
teamXX
admin
teamZZ
user1
user2
user3
users
wheel
server group role unx user unx group
● user2 は admin role で appXX, appZZ サーバーにログイン可能
users と wheel グループに所属
● user1 は teamXX, teamZZ role を持ち appXX, appZZ にログイン可能
● user3 は teamZZ role で appZZ サーバーにのみログイン可能
Setup client (CentOS 7)
# Install Pckages
$ curl -fsSL https://repo.stns.jp/scripts/yum-repo.sh | sh
$ sudo yum -y install stns libnss-stns libpam-stns nscd
# /etc/stns/libnss_stns.conf の編集
api_end_point = ["http://localhost:1104/v3"]
# user = "basic_user"
# password = "basic_password"
# wrapper_path = "/usr/local/bin/stns-query-wrapper"
# chain_ssh_wrapper = "/usr/libexec/openssh/ssh-ldap-wrapper"
# ssl_verify = true
# request_timeout = 3
# http_proxy = "http://example.com:8080"
# [request_header]
# x-api-key = "token"
package に含まれる
編集前の内容
これを必要に応じて
書き換える
Setup client (CentOS 7)
# Login 時に home directory を作成するようにする
$ echo 'session required pam_mkhomedir.so skel=/etc/skel/ umask=0022' ¥
| sudo bash -c “cat >> /etc/pam.d/sshd”
# sshd で Public key 取得に使えるようにする
$ sudo sed -i -r ¥
-e 's@^#?(AuthorizedKeysCommand) .*@¥1 /usr/lib/stns/stns-key-wrapper@' ¥
-e 's@^#?(AuthorizedKeysCommandUser) .*@¥1 root@' ¥
/tmp/sshd_config
Setup client (CentOS 7)
# nsswitch.conf 設定 (passwd, shadow, group に stns を追加)
$ sudoedit /etc/nsswitch.conf
passwd: files sss stns
shadow: files sss stns
group: files sss stns
# nscd.conf 設定 (毎回外部へ問い合わせていては遅いのでキャッシュさせる)
$ sudoedit /etc/nscd.conf
$ sudo systemctl enable nscd
$ sudo systemctl start nscd
(しかし、cache の TTL の動作が謎)
Setup client (CentOS 7)
# SELinux が有効だとブロックされるため一部のドメインを permissive に変更
$ sudo yum -y install policycoreutils-python
$ sudo semanage permissive -a sshd_t
$ sudo semanage permissive -a chkpwd_t
$ sudo semanage permissive -a nscd_t
demo
作ってみた感想
● 履歴を残そうと思ったら面倒
● TOML とか YAML で Git 管理が合っていそう
● 書き直す予定
あれ???
オリジナルサーバーに近づくね
● nscd の TTL の仕様がよくわからん
● SELinux 対応が必要
pyama さんありがとう

STNSサーバーを書いてみた