ちょっと調べ物です。
Linuxのユーザ管理をちゃんとやろうと思うとLDAPを使うことが多いと思います。が、やったことある人ならわかると思うんですが、ちょっとめんどくさい。ということで、今更感ありますが、「STNS」を試してみます。
STNSとは?
STNS allows you to easily manage Linux users with simple TOML-based configuration. It consists of server and client implementation, which requires only a few steps to install. Moreover, you can use it with existing user management systems such as LDAP.
Linuxユーザ管理をTOMLベースの設定ファイルで管理し、サーバ・クライアント感のやりとりはREST APIで行う、というものです。設定ファイルでUID/GID/公開鍵の管理ができるので、github-flow的な使い方にも向いています。
事前準備
- 以下の構成とします。
- STNSサーバ
- ホスト名:stns-server.example.internal
- IPアドレス:10.240.0.100/24
- STNSクライアント
- ホスト名:stns-client.example.internal
- IPアドレス:10.240.0.101/24
- STNSサーバ
- どちらもOSはCentOS7とし、SELinuxとFirewalldは止めておきます。
- 名前解決ができるようにしておいてください。
サーバ/クライアント共通の設定
STNSのyumレポジトリの設定を行います。
$ curl -fsSL https://repo.stns.jp/scripts/yum-repo.sh | sudo bash
stnsをインストールします。cache-stnsdはレポジトリにないようなので、githubのreleaseから直接引っ張ってきてます。
$ sudo yum install -y stns-v2 libnss-stns-v2 https://github.com/STNS/cache-stnsd/releases/download/v0.3.1/cache-stnsd-0.3.1-1.x86_64.el7.rpm
サーバの設定
/etc/stns/server/stns.confで以下を有効にします。
port = 1104 include = "/etc/stns/conf.d/*.conf
/etc/stns/conf.dにグループごとに設定ファイルを用意して、所属するユーザの設定もそこに書くこととします。サンプルで以下のグループ・ユーザを作ろうと思います。
- fabfourグループ
- GID: 1001
- ユーザ
- john
- UID: 1001
- paul
- UID: 1002
- george
- UID: 1003
- ringo
- UID: 1004
- john
- wildhorsesグループ
- GID: 2001
- ユーザ
-mick
- UID: 2001
- keith
- UID: 2002
- ron
- UID: 2003
- charlie
- UID: 2004
- 共通
- ホームディレクトリは/home/*
- シェルは/bin/bash
事前に各ユーザのSSHの鍵ペアを用意しておきましょう。こんなスクリプト(ssh-keygen.sh)を用意しました。
#!/bin/sh DOMAIN="example.internal" if [ $# != 1 ]; then echo "[Usage] $0 user_name" exit 1 fi USER_NAME=$1 ssh-keygen -t rsa -b 4096 -N "" -C "${USER_NAME}@${DOMAIN}" -f ${USER_NAME}.id_rsa
まるっと作ります。
$ for i in john paul george ringo mick keith ron charlie >do >./ssh-keygen.sh $i >done
鍵ペアが作成できました。
$ ls charlie.id_rsa john.id_rsa.pub paul.id_rsa.pub charlie.id_rsa.pub keith.id_rsa ringo.id_rsa example.id_rsa keith.id_rsa.pub ringo.id_rsa.pub george.id_rsa mick.id_rsa ron.id_rsa george.id_rsa.pub mick.id_rsa.pub ron.id_rsa.pub john.id_rsa paul.id_rsa
ディレクトリを作成
$ mkdir -p /etc/stns/conf.d
では設定ファイルを用意しましょう。fabfourグループの設定ファイル(/etc/stns/conf.d/fabfour.conf)から。keys
のところは各ユーザの公開鍵の内容を記載します。
[users.john] id = 1001 group_id = 1001 keys = ["ssh-rsa ...(snip)..."] shell = "/bin/bash" [users.paul] id = 1002 group_id = 1001 keys = ["ssh-rsa ...(snip)..."] shell = "/bin/bash" [users.george] id = 1003 group_id = 1001 keys = ["ssh-rsa ...(snip)..."] shell = "/bin/bash" [users.ringo] id = 1004 group_id = 1001 keys = ["ssh-rsa ...(snip)..."] shell = "/bin/bash" [groups.fabfour] id = 1001 user = [ "john", "paul", "george", "ringo" ]
同じようにwildhorsesグループ(/etc/stns/conf.d/wildhorses.conf)も。
[users.mick] id = 2001 group_id = 2001 keys = ["ssh-rsa ...(snip)..."] shell = "/bin/bash" [users.keith] id = 2002 group_id = 2001 keys = ["ssh-rsa ...(snip)..."] shell = "/bin/bash" [users.ron] id = 2003 group_id = 2001 keys = ["ssh-rsa ...(snip)..."] shell = "/bin/bash" [users.charlie] id = 2004 group_id = 2001 keys = ["ssh-rsa ...(snip)..."] shell = "/bin/bash" [groups.wildhorses] id = 2001 user = [ "mick", "keith", "ron", "charlie" ]
設定できたらstnsをあげます。
$ sudo systemctl start stns $ sudo systemctl enable stns
サーバの設定はこれで終わりです。
クライアントの設定
/etc/stns/client/stns.confで以下を有効にします。APIエンドポイントのところはSTNSサーバのホスト名を記載します。名前解決ができないならIPアドレスでもいいです。
api_endpoint = "http://stns-server.example.internal:1104/v1" [cached] enable = true
cache-stnsdを起動します。
$ sudo systemctl restart cache-stnsd $ sudo systemctl enable cache-stnsd
STNSを使ってユーザ名・グループ名を解決できるようにします。/etc/nsswitch.confのpasswd, shadow, groupの末尾に"stns"を追加します。
passwd: files sss stns shadow: files sss stns group: files sss stns
sshdでstnsでの認証を行えるようにします。/etc/ssh/sshd_configに以下を設定します。
PubkeyAuthentication yes AuthorizedKeysCommand /usr/lib/stns/stns-key-wrapper AuthorizedKeysCommandUser root
sshdに反映します。
$ sudo systemctl restart sshd
あと、新規ログイン時にホームディレクトリを作成するようにしましょう。/etc/pam.d/sshに以下を追記します。
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
これでクライアント側も完了です。
接続してみる
client側へのログインを試してみましょう。
$ ssh -i john.id_rsa john@stns-client.example.internal [john@stns-client ~]$ id uid=1001(john) gid=1001(fabfour) groups=1001(fabfour) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [john@stns-client ~]$ pwd /home/john
$ ssh -i paul.id_rsa paul@stns-client.example.internal [paul@stns-client ~]$ id uid=1002(paul) gid=1001(fabfour) groups=1001(fabfour) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [paul@stns-client ~]$ pwd /home/paul
$ ssh -i mick.id_rsa mick@stns-client.example.internal [mick@stns-client ~]$ id uid=2001(mick) gid=2001(wildhorses) groups=2001(wildhorses) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [mick@stns-client ~]$ pwd /home/mick
$ ssh -i keith.id_rsa keith@stns-client.example.internal [keith@stns-client ~]$ id uid=2002(keith) gid=2001(wildhorses) groups=2001(wildhorses) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [keith@stns-client ~]$ pwd /home/keith
ちゃんとできていますね。
まとめ
LDAPに比べるととてもかんたんですね。グループごとにファイルを分けれるので管理もしやすいです。ちなみに今のバージョンだと、
- S3で設定ファイルを管理
- バックエンドにDynamoDBも使用可能
なので、AWS上で使うのにも良さそうです。また試してみたいと思います。