ぽよメモ

レガシーシステム考古学専攻

Octopassで簡単ユーザ管理

きっかけ

ちょっとした技術コミュニティを作りたくなって友人と学内で一つ非公式サークルを立ち上げました.
当然のようにVPSを借り,Webサーバを立ち上げ,Wikiを建て…なんていうのを考えているとき,ふと「ユーザ管理面倒だな.LDAPほど大げさじゃない何か良いものはないだろうか」と考えてググったら出てきました.

github.com

Githubをバックエンドとして使用してユーザ認証できるなんてステキ!と飛びついてみたら簡単にできて最高だったという話です.

環境

メンバーもまだ少なく,ほとんど創立メンバーの友人と二人で折半するので費用は抑えたい…ということでさくらのVPSのメモリ1GBプランを契約.年額一括1万円程度で固定IPのあるサーバが使えるのはありがたいです.

OSには使い慣れているUbuntuを選択しました.

導入

基本は下記ページ及びgithubのREADMEに従うだけです.

linyo.ws

下記操作は全てさくらのVPSのコントロールパネルからアクセスできるシリアルコンソールから行っています.

Octopassのインストール

UbuntuCentOSならソースからコンパイルしなくても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のみで良いようです.

f:id:pudding_info:20171211000509p:plain

設定ファイルの作成

設定ファイルのテンプレートが用意されているので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上で行っていますが,やることとしてはWindowsLinuxでも同じで

  1. 公開鍵と秘密鍵のペアを作る
  2. Githubに公開鍵を登録

の2つだけです.

鍵ペアの作成

ssh-keygenコマンドを使用します.-Cはコメントで,末尾に付加されるユーザ名@ホスト名を上書きします(オプション).

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/{key name} -C "youremail@hoge.com"

公開鍵の中身をクリップボードにコピーします.

$ pbcopy < ~/.ssh/{key name}.pub

登録

  1. https://github.com/settings/keys からログイン
  2. 右上のNew SSH keyをクリック
  3. わかりやすいTitleを入力してKeyセクションに先ほどコピーした公開鍵をペースト
  4. 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.confGroupsがユーザの所属するグループを決定するのですが,これをsudoとかにしてもsudoはできません.どうやるんだーーーーとなってissueで質問させていただきました.

github.com

まさかその日中にレスポンスを頂けるとは…ありがたい.

というわけで,/etc/sudoers.d/以下に設定を追記します.

sudoerへのグループの追加

/etc/octopass.confGroupsを設定しなかった場合,初期値は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にメンバーを追加するだけで済みます.また,複数サーバを建てた際にも最初にこれを導入さえしてしまえば他のメンバがログインして作業できるため効率的です.

サーバ数台程度の規模ならばGithubAPI制限にかかる可能性は低いですし,速度面も特に気になりませんでした.Githubが落ちてるときはどうせまともに作業できないのでゆっくりコーヒーでも飲んで待ちます.

あとは複数ロールへの対応が欲しい…sudo不可のTeamを追加して運用できれば小規模チームにとってはかなり最高なソリューションなのでは.
以上,導入してみた所感でした.

*1:riceplanting.hatenablog.jp

*2:Githubアカウントをつかってsshしてもsudo権限なくて作業できないため

*3:ちょっと怖いですが正直sshの公開鍵認証が破られた時点で終わりみたいなものという気がしているので現状あまり気にしていません.sshコネクション張ったままPCを放置していたら知らん…そんな奴うちには居ないはず…