現在関わっているプロジェクトで、26台の仮想サーバー(AWS EC2)を利用しています。私はroot権限を持つ管理者で、開発メンバーをどのサーバーにアクセスさせるか管理しています。特定のサーバーにアクセス権限の割り振りを行うには、以下のように単純作業ですが開発メンバーが多いと大変手間です。

・権限を与えるユーザーのSSH公開鍵を確認
・該当のサーバーでユーザー作成
・sshディレクトリ作成など、数多くのコピペ作業

特に面倒くさいと感じるのは、ユーザー作成後、パスワードを「changeme」などに設定して、メンバーに「ユーザーを作ったよ!パスワードを変えてください。」と伝えることです。
毎回同じことの繰り返し作業で、5分程度で終わるものの時間が勿体無いと思ったので、改善対策を探してみました。

対策

フランジアの社内には同様の課題を解決してきた経験者が何人もいたので、すぐに対策を見つけることができました。SSH公開鍵やコマンドなどをバラバラとメモするのではなく、ユーザー作成のbashスクリプトを開発メンバーに用意して貰って、該当のサーバーで実行する対策です。超簡単!

例えばadminグループにbs90というユーザーを作成するbashスクリプトはこんな感じです。

#!/bin/bash
useradd -d /home/bs90 -s /bin/bash -m bs90 -G admin
mkdir /home/bs90/.ssh
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUCPMsp8q/h/JtCqFH...itistoolong...K1iIj bs90_htdd@yahoo.com.vn' > /home/bs90/.ssh/authorized_keys
chown -R bs90:bs90 /home/bs90/.ssh
chmod 700 -R /home/bs90/.ssh
chmod 600 -R /home/bs90/.ssh/*
sed -i '/^bs90:.*$/d' /etc/shadow
echo 'bs90::$6$F2...hidden...Ux1.:16728:0:99999:7:::' >> /etc/shadow

これから詳しく説明します。

具体的な説明

ユーザー作成

useradd -d /home/bs90 -s /bin/bash -m bs90 -G admin

bs90というユーザーをadminグループ指定で作成, ホームディレクトリを /home/bs90にするコマンドです. man useradd を実行すればuseraddコマンドの使い方がわかると思いますが、ID指定やグループ指定などもいろいろ出来ます。

authorized_keysを作成

mkdir /home/bs90/.ssh
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUCPMsp8q/h/JtCqFH...itistoolong...K1iIj bs90_htdd@yahoo.com.vn' > /home/bs90/.ssh/authorized_keys

ホームディレクトリに.sshディレクトリを作成し、ユーザーの公開鍵をauthorized_keysファイルに記入するコマンドです。これをやったことで、該当の秘密鍵を持っているPCしかアクセス出来ないという設定が出来ました。

権限付与

chown -R bs90:bs90 /home/bs90/.ssh
chmod 700 -R /home/bs90/.ssh
chmod 600 -R /home/bs90/.ssh/*

.sshディレクトリに関する権限規則が幾つかあります。(「ssh permissions are too open」というエラーを見たことが有りますか。)上記の3つのコマンドを実行することだけで正しく設定出来ます。

Shadow

/etc/shadowというファイルがあって、それにサーバー内のすべてのユーザーの暗記されたパスワードが保存されています。bs90ユーザーのshadowはこんな感じです。

bs90::$6$F2...hidden...Ux1.:16728:0:99999:7:::

私が知っている限り、このHash化された文字列にはユーザー名・パスワード・パスワード変更の最終時刻などの8種類の情報があります。一番役に立つのは、一回開発メンバーにパスワードを変更して貰ったらshadowをとれますので、そのまま別のサーバーで使えば、「ユーザーを作りましたよ!パスワードを変えてください。」という連絡をしなくて済みます。

sed -i '/^bs90:.*$/d' /etc/shadow
echo 'bs90::$6$F2...hidden...Ux1.:16728:0:99999:7:::' >> /etc/shadow

デフォルトのshadowを切り替えるコマンドです。

これで、今後開発メンバーにサーバーのアクセス権限を与える必要が出たら、5秒でユーザー作成が完了できます! 12人いたら、60分の作業を1分に短縮できます。

逆に自分があるサーバーにアクセスしたいなら、自分用のbashスクリプトを作成して、管理者に渡せば良いので、非常に便利ですね!

結論

技術には関係ないんですが、日常生活にも何回も繰り返さないといけないことがあるだろうと思います。何回やっても嬉しいことであればそれでいいんですが、詰まらないと思ったらその状態を避ける方法を探せば良いかと思います。以上です。