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