ロリポップ!マネージドクラウドでSTNSを動かしてみた 〜STNS as a Service〜

こんにちは。先日、筆者が開発に携わっているロリポップ!マネージドクラウドにおいてGolangコンテナがリリースされたので、STNSを個人プロジェクトなどで利用できるようにSTNS as a Serviceを作ってみました。

STNSとはなんぞやという方はこちらのスライドを見てください。

まずはプロジェクトを作っていきます。今回はドメインを stns.lolipop.io としました。

入力し、プロジェクトを作成すると20秒ほどで可愛いゴーファーくんに会えました。

デプロイの手順は公式のヘルプを参考にやってみます。

今回はgo runでの実行ではなくバイナリをアップロードして進めました。

$ /STNS (master) % GOOS=linux GOARCH=amd64 make build
$ scp -P 35279 tmp/bin/stns dark-hitoyoshi-1876@ssh-1.mc.lolipop.jp:/var/app

scpの送り先はプロジェクトの設定画面のsshの記述を参考にします。ポートの指定が -P なのでそこだけ注意。

起動コマンドを指定する前に、SSHでログインして、プロセスを起動してみます。

$ ssh -p 35279 dark-hitoyoshi-1876@ssh-1.mc.lolipop.jp
dark-hitoyoshi-1876@golang-ssh-stns:~$ vi stns.conf
dark-hitoyoshi-1876@golang-ssh-stns:~$ cat stns.conf
port = 8080
[users.pyama]
id = 10000
group_id = 10000
keys = ["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZx4lWgqP3VDoypCihYrC7SZRWVuvqejTeo6Jf5MvS4m1U6NDGcdUHoi3S0LuB6IW3x7NkNYrGMvucQxHdIqL9iNbtDvXVMJwE1w77htGCvEl3yYgdqCgIuoK/IwOiQFUaSjmTzX87WC3ZIolGp/nUO1nhOKEM9b6yETEzGAkg4Gx0sSeI7IcBkyXzboS/WiVviEvyt/6KhrpoAiGCt/VhKpZVRa+V+J/WL0nzYcM5u+yQrYddOA6zHcd5xe/+chtg7LzC/rA6anCEP0GVAT9eYHkz9nR9Z+gq4mg/Yoi0MZp7bAfp3RZi4GM5Ey5RZHWUaVhjP0QwdKPLeMHTuAWd"]

[groups.stns]
id = 10000
dark-hitoyoshi-1876@golang-ssh-stns:~$ /var/app/stns --config /var/app/stns.conf server

____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.2.1
High performance, minimalist Go web framework

____________________________________O/_______
O\
⇨ http server started on [::]:8080

どうやら動いてしまったようなので、コンパネで起動コマンドを変えてみます。

動作確認してみましょう。

curl -s "https://stns.lolipop.io/v1/users?name=pyama" | jq
[
{
"id": 10000,
"name": "pyama",
"password": "",
"group_id": 10000,
"directory": "",
"shell": "",
"gecos": "",
"keys": [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZx4lWgqP3VDoypCihYrC7SZRWVuvqejTeo6Jf5MvS4m1U6NDGcdUHoi3S0LuB6IW3x7NkNYrGMvucQxHdIqL9iNbtDvXVMJwE1w77htGCvEl3yYgdqCgIuoK/IwOiQFUaSjmTzX87WC3ZIolGp/nUO1nhOKEM9b6yETEzGAkg4Gx0sSeI7IcBkyXzboS/WiVviEvyt/6KhrpoAiGCt/VhKpZVRa+V+J/WL0nzYcM5u+yQrYddOA6zHcd5xe/+chtg7LzC/rA6anCEP0GVAT9eYHkz9nR9Z+gq4mg/Yoi0MZp7bAfp3RZi4GM5Ey5RZHWUaVhjP0QwdKPLeMHTuAWd"
]
}
]

無事動いていますね。これだけでは面白くないのでこのサイト(ten-snapon.com)のサーバをSTNSでログインできるようにしてみます。まずは libnss-stns-v2をインストールします。インストールはドキュメントサイトに手順があるのでそちらをコピペしていきます。

$ curl -fsSL https://repo.stns.jp/scripts/yum-repo.sh | sh
$ yum -y install libnss-stns-v2
$ vi /etc/stns/client/stns.conf
$ cat /etc/stns/client/stns.conf
api_endpoint = "https://stns.lolipop.io/v1/"
$ vi /etc/nsswitch.conf
$ cat /etc/nsswitch.conf |grep stns
passwd: files stns
shadow: files stns
group: files stns
$ id pyama
uid=10000(pyama) gid=10000(stns) groups=10000(stns)

たったこれだけでサーバレスなLinux名前解決システムが出来てしまいました。更には、SSHログイン時の公開鍵認証もSTNSで実行してみます。

$ vi /etc/ssh/sshd_config
$ cat /etc/ssh/sshd_config
AllowUsers pyama
AuthorizedKeysCommand /usr/lib/stns/stns-key-wrapper
AuthorizedKeysCommandRunAs root
ChallengeResponseAuthentication no
PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
UsePAM yes
$ service sshd restart

これでSSHログイン時にSTNSから公開鍵をもらえるはずなので、確認してみます。

$ ssh pyama@ten-snapon.com
[pyama@xxxxxxx ~]$ id
uid=10000(pyama) gid=10000(stns) groups=10000(stns)

無事SSHログインが出来るようになりました。作った手前あれなんですがだいぶお手軽ですね。

ちなみに AuthorizedKeysCommandRunAs はOSごとにパラメーター名が異なるので気をつけてください。

ここまででSTNSをマネージドクラウドで動かすことが出来るようになったのですが、秘匿情報でもないのでGithubでSTNSの設定ファイルを管理し、自動でデプロイ出来るようにしてみました。

リポジトリをcloneすると users.confgroups.confがあるので、そちらをREADMEに沿って編集し、PRを投げると、CIで書式チェックが行われます。masterマージされるとロリポップマネージドクラウドにデプロイされ、名前解決が可能になります。sshdのコンフィグでログイン可能なユーザーを制限しておけばセキュアですし、ちょっとした個人サーバや、複数環境管理するフリーランスの方などは便利だと思うのでぜひ活用してみてください。