こんなん作りました

STNS+AWS API Gataway+DynamoDBでサーバレスユーザ統合管理
https://github.com/shogomuranushi/stns-apibackend

これなんなん?

STNSという簡易LDAP的なユーザ管理のOSSとAPI Gateway、DynamoDBを組み合わせたもの

何が出来るん?

複数台のLinuxユーザ管理を手軽にサーバレスで出来る

今までのユーザ管理は何があかんかったん?

How Use
PAM ベター。複数台は管理出来ない。複数台管理するなら同じコマンドとかを実行して回る必要有り
LDAP Lightweight?大規模なら良いけど管理面倒。学習コスト高い
STNS これ。(以下参照)

STNS

STNSで何が課題やったん?

お客さん「十数台規模でLDAPとか面倒だよね。管理とか冗長化とかも考えたくないし。」
俺「STNSでもサーバ側のインフラ管理面倒だな、、。やりたいのはユーザ管理でサーバ管理じゃないし」
俺「STNSのバックエンドははRESTで受けてJSONで返せば何でもいいのか。API GatewayとDynamoDB使えばバックエンドをサーバレスに出来るんじゃ?」

実現したこと

STNS+AWS API Gataway+DynamoDBでサーバレスユーザ統合管理

構成

What How
クライアント(Linuxサーバ) STNS
バックエンドのSTNSサーバ API Gateway+DynamoDB

特徴

STNSでシンプルにユーザの統合管理を実現

  • シンプルで軽量
  • 既存のPAMも併用可能
  • バックエンドはRESTであれば自由

バックエンドのSTNSサーバはAPI GatewayとDynamoDBを利用することでサーバレスで高可用性

  • 冗長化とか考える必要無し(もちろん止まることはある)
  • DynamoDBは複数箇所にデータ分散してるためバックアップ不要
  • PaaSなのでサーバの運用とか障害対応とか不要
  • サーバ間はAPIキーにて認証

OSユーザの管理もAWSコンソールからする時代に

  • ユーザ管理はDynamoDB上なのでマネジメントコンソール
  • もちろんAWS CLI、SDKで管理も可能

導入方法(安心してください。自動化してます。)

準備するもの

AWSのアクセスキー、シークレットキーを手元に

1.terraformのインストール

1 https://www.terraform.io/downloads.html からterraformをダウンロードし解凍する
2 パスの通ったディレクトリに置くか、任意のディレクトリに置いてパスを通してください
3 terraform –helpを実行しヘルプが表示されたらインストール完了

$ terraform --help

2.stns-apibackend(apigateway+dynamodb)のインストール

$ git clone https://github.com/shogomuranushi/stns-apibackend.git
$ cd stns-apibackend
$ vi aws.tf

variable "role" {
    default = "user" #必要に応じて好きな役割名に変更
}

variable "region" {
    default = "ap-northeast-1" #API GatewayとDynamoDBをデプロイするリージョンを指定
}

provider "aws" {
    access_key = "" #アクセスキーを指定
    secret_key = "" #シークレットキーを指定
    region = "${var.region}"
}

3.stns-apibackend(apigateway+dynamodb)の構築

terraform実行後に最終行に表示される「API Gateway URL」「API Key」をメモる。
※ applyは1回目でエラーが出た場合はもう一度実行してください。実行順序の整理が出来ていません。

$ terraform plan #動作確認
$ terraform apply #実行、反映
xxx
xxx
xxx

Outputs:

API Gateway URL = https://xxxxxxx
API Key = xxxxxx

4.stnsのインストールと各種設定

最新手順や、やってる内容は http://stns.jp/ja/install 参照
簡易に試したい人はクライアントとなるサーバで、以下に↑の「API Gateway URL」と「API Key」を埋め込んでコピペしてください


API_Gateway_URL="https://xxx"
API_Key="xxx"

# STNSのインストール


curl -fsSL https://repo.stns.jp/scripts/yum-repo.sh | sh
yum -y install stns libnss-stns libpam-stns nscd

# ユーザーとグループ名の名前解決をキャッシュ関係
cat < /etc/nscd.conf
#       logfile         /var/log/nscd.log
#       threads         4
#       max-threads         32
        server-user         nscd
#       stat-user           somebody
        debug-level         0
#       reload-count        5
        paranoia            no
#       restart-interval        3600
enable-cache            passwd          yes
positive-time-to-live   passwd          180
negative-time-to-live   passwd          300
check-files             passwd          yes
shared                  group           yes

enable-cache            group           yes
positive-time-to-live   group           180
negative-time-to-live   group           300
check-files             group           yes
shared                  group           yes

enable-cache            hosts           no
enable-cache            services        no
enable-cache            netgroup        no
EOF
service nscd reload


# STNSサーバの接続先定義


sed -i -e "s/^api_end_point/#api_end_point/g" /etc/stns/libnss_stns.conf
sed -i -e "s/# wrapper_path/wrapper_path/g" /etc/stns/libnss_stns.conf
echo "api_end_point = [\"${API_Gateway_URL}\"]" >> /etc/stns/libnss_stns.conf
echo "x-api-key = \"${API_Key}\"" >> /etc/stns/libnss_stns.conf


# STNS経由での名前解決を有効


sed -i -e "s/passwd:     files sss/passwd:     files stns sss/g" /etc/nsswitch.conf
sed -i -e "s/shadow:     files sss/shadow:     files stns sss/g" /etc/nsswitch.conf
sed -i -e "s/group:      files sss/group:      files stns sss/g" /etc/nsswitch.conf


# ログイン時のホームディレクトリ作成(この手順はSTNSインストール手順になかった)


echo "session optional pam_mkhomedir.so skel=/etc/skel umask=022" >> /etc/pam.d/system-auth-ac
echo "session optional pam_mkhomedir.so skel=/etc/skel umask=022" >> /etc/pam.d/password-auth


# SSHログインを可能にする


echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config
echo "AuthorizedKeysCommand /usr/lib/stns/stns-key-wrapper" >> /etc/ssh/sshd_config
echo "AuthorizedKeysCommandUser root" >> /etc/ssh/sshd_config
service sshd restart

5.ユーザ追加(お好きにどうぞ)

DynamoDBの「user-stns-osuser」と「user-stns-osgroup」にユーザ情報を登録
※サンプル等を登録する詳細は以下参照

6. 動作確認

$ id orenouser
uid=1002(orenouser) gid=1002(orenogroup) groups=1002(orenogroup)

管理方法

DynamoDBなのでマネージメントコンソールでもSDK経由でも更新可能

一応、サンプル用意した。

アクセスキー、シークレットキーを入れて下さい

export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export AWS_DEFAULT_REGION=ap-northeast-1
./dynamodb-sampleuser.sh

補足:DynamoDB定義情報

user情報(表)

Key Value
name orenouser
id 1002
directory /home/orenouser
gecos null
group_id 1002
keys “ssh-rsa xxxxx”
link_users null
password null
shell /bin/bash

group情報(表)

Key Value
name orenogroup
id 1002
link_groups null
users “orenouser”

最後に

API GatewayとDynamoDBはPaaSなので止まることは有る
止まった時用に別口で入れるユーザ(PAM)は用意しておいてください

いろいろ夢広がりますな

元記事はこちら

Linuxユーザ管理の決定版? 〜STNSとサーバレスで夢が広がる〜【cloudpack大阪ブログ】