kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

Linuxのユーザ管理にSTNSを使う

ちょっと調べ物です。

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
  • どちらも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
  • 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上で使うのにも良さそうです。また試してみたいと思います。