Edited at

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

More than 3 years have passed since last update.


こんなん作りました

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


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 <<EOF > /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)は用意しておいてください


いろいろ夢広がりますな