きっかけ
ちょっとした技術コミュニティを作りたくなって友人と学内で一つ非公式サークルを立ち上げました.
当然のようにVPSを借り,Webサーバを立ち上げ,Wikiを建て…なんていうのを考えているとき,ふと「ユーザ管理面倒だな.LDAPほど大げさじゃない何か良いものはないだろうか」と考えてググったら出てきました.
Githubをバックエンドとして使用してユーザ認証できるなんてステキ!と飛びついてみたら簡単にできて最高だったという話です.
環境
メンバーもまだ少なく,ほとんど創立メンバーの友人と二人で折半するので費用は抑えたい…ということでさくらのVPSのメモリ1GBプランを契約.年額一括1万円程度で固定IPのあるサーバが使えるのはありがたいです.
OSには使い慣れているUbuntuを選択しました.
導入
基本は下記ページ及びgithubのREADMEに従うだけです.
下記操作は全てさくらのVPSのコントロールパネルからアクセスできるシリアルコンソールから行っています.
Octopassのインストール
UbuntuやCentOSならソースからコンパイルしなくてもpackagecloudに既に用意されています.ありがたい.
$ sudo apt-get update $ sudo apt-get upgrade $ curl -s https://packagecloud.io/install/repositories/linyows/octopass/script.deb.sh | sudo bash $ sudo apt-get install octopass
Personal Access Tokenの取得
https://github.com/settings/tokens/newからログインして新しいトークンを作成します.
このとき,必要な権限はadmin:org
の中のread:org
のみで良いようです.
設定ファイルの作成
設定ファイルのテンプレートが用意されているのでmv
します.
$ sudo mv /etc/octopass.conf.example /etc/octopass.conf $ sudo vim /etc/octopass.conf
設定ファイルの必要な項目を埋めます.僕は下記のコメントを外しているところのみを埋めています.
# O C T O P A S S # Required Token = "{Your token}" ## Use team Organization = "{Your org}" Team = "{Your team}" ## Use collaborators #Owner = "yourname" #Repository = "yourrepository" # Default #Endpoint = "https://api.github.com/" #Group = "" Home = "/home/%s" Shell = "/bin/bash" #UidStarts = 2000 #Gid = 2000 #Cache = 300 Syslog = true # Advanced #SharedUsers = [ "admin", "deploy" ]
情報が取れるか確認してみます.
$ sudo octopass passwd hoge:x:120000:2000:managed by octopass:/home/hoge:/bin/bash fuga:x:130000:2000:managed by octopass:/home/fuga:/bin/bash
こんな感じでチームに所属しているメンバーが一覧で表示できるはずです.
sshdやpamの設定
これらをsshdやpamから叩けるようにします.とはいってもgithubとかにあるコードをそのままコピペすれば動きます.ステキ.
/etc/ssh/sshd_config
デフォルトではパスワードによるsshなどが可能なので制限します.
# rootログイン禁止 PermitRootLogin no # 鍵認証にoctopassをrootから叩いて使用 AuthorizedKeysCommand /usr/bin/octopass AuthorizedKeysCommandUser root # 公開鍵認証を有効に RSAAuthentication yes PubkeyAuthentication yes # パスワード認証を無効 PasswordAuthentication no # PAMを使用 UsePAM yes
/etc/pam.d/sshd
@include common-auth
は元から記述されているのでコメントアウトします.
#@include common-auth
auth requisite pam_exec.so quiet expose_authtok /usr/bin/octopass pam
auth optional pam_unix.so not_set_pass use_first_pass nodelay
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
/etc/nsswitch.conf
これを触ったのは初めてだったのですが,名前解決の順序を決定するための設定のようです*1.
passwd
, shadow
, group
の3項目を下記のように変更.
passwd: files octopass sss shadow: files octopass sss group: files octopass sss
Githubへの鍵の登録
既にやってるひとは飛ばして構わないです.
ここの操作はMacBook Pro上で行っていますが,やることとしてはWindowsやLinuxでも同じで
の2つだけです.
鍵ペアの作成
ssh-keygen
コマンドを使用します.-C
はコメントで,末尾に付加されるユーザ名@ホスト名
を上書きします(オプション).
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/{key name} -C "youremail@hoge.com"
公開鍵の中身をクリップボードにコピーします.
$ pbcopy < ~/.ssh/{key name}.pub
登録
- https://github.com/settings/keys からログイン
- 右上の
New SSH key
をクリック - わかりやすいTitleを入力して
Key
セクションに先ほどコピーした公開鍵をペースト Add SSH key
をクリック
SSHしてみる
クライアントPCからアクセスしてみます.今後のためにまず~/.ssh/config
に設定を追記しておきます.sshするポートを変更している人などは適宜読み替えてください.
ServerAliveInterval 60 Host hoge HostName {address of your server} User {your github name} Port 22 IdentityFile ~/.ssh/{key name}
いざログイン(初回はAre you sure you want to continue connecting (yes/no)?
みたいなメッセージが出ます)
$ ssh hoge Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-62-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage SAKURA Internet [Virtual Private Server SERVICE] Last login: Sun Dec 10 00:00:00 2017 from 000.00.00.0 {your github name}@{your host}:
わーいやったー!
sudoしたい
ここまででsshはできましたが,実はこのままではsudo
できません./etc/octopass.conf
のGroups
がユーザの所属するグループを決定するのですが,これをsudo
とかにしてもsudo
はできません.どうやるんだーーーーとなってissueで質問させていただきました.
まさかその日中にレスポンスを頂けるとは…ありがたい.
というわけで,/etc/sudoers.d/
以下に設定を追記します.
sudoerへのグループの追加
/etc/octopass.conf
のGroups
を設定しなかった場合,初期値はGithub Teamのチーム名が使用されます(ここではhoge
とします).
このhoge
グループに対してパスワードを要求せずsudo
する権限を与える必要があるようです.(ここからはサーバ上での作業です.さくらのVPSのシリアルコンソールから作業しました*2)
$ sudo visudo -f /etc/sudoers.d/hoge
立ち上がるのがvimじゃなくていつも戸惑うのですが,下記のように記述します.
%hoge ALL=(ALL) NOPASSWD: ALL
これで保存するとhoge
グループのユーザはパスワード無しでsudo
できるようになります*3.
まとめ
Team単位で認証できるため,例えば新しく鯖管を育成したいとなったときもユーザ作って〜鍵登録して〜とかせず,Teamにメンバーを追加するだけで済みます.また,複数サーバを建てた際にも最初にこれを導入さえしてしまえば他のメンバがログインして作業できるため効率的です.
サーバ数台程度の規模ならばGithubのAPI制限にかかる可能性は低いですし,速度面も特に気になりませんでした.Githubが落ちてるときはどうせまともに作業できないのでゆっくりコーヒーでも飲んで待ちます.
あとは複数ロールへの対応が欲しい…sudo
不可のTeamを追加して運用できれば小規模チームにとってはかなり最高なソリューションなのでは.
以上,導入してみた所感でした.