おはよう世界。どうも若林です。
先日友達とその子どもたちと池袋にある水族館へ行ってきたのですが、子供の元気いっぱいな体力って凄いですよね・・・。
帰りに公園へ寄って遊び相手をしていたのですが、後半からは息切れして私の体力の衰えを感じます。
これが小学校低学年の体力か・・・!!若者は体力がすごい・・・!!!
世の中のお父さんお母さんは凄いなって改めてリスペクトを感じた一日でした。
さて、今回は複数のユーザーを作成からログイン可能状態にまで一気に可能にするシェルスクリプトを作ってみました。
本当は別の内容の技術ブログを書いてたのですが、難しくてまだ完成していない為、急遽最近やった小ネタをなるべくLinux初心者の方向けご紹介します。
目次
複数でのユーザー作成ってめんどくさいですよね
とある顧客の案件で「サーバー内に複数人のSSHユーザーを作成してほしい」という依頼分が届きました。
リスト付きで届いたのでまずは見てみました。そうしたら十数人分のユーザー情報が届きました。
これはいつも通りにユーザー作成するのは中々大変。。。って思い、先輩が「シェルスクリプトで作成してもらったらいいかも」というお言葉をいただき、たしかにそれなら楽だということで早速作りました。
今回やりたいこととしては、ユーザー作成・パスワード設定・sudo権限付与・SSH接続用の公開鍵、秘密鍵の生成や設定・権限周りを一気にやりたいです。
この流れを作成したいユーザー分と手間がかかりますのでシェルスクリプトで実行して、一気にやっちゃおう!ということになります。
実際のスクリプト
ではまず、今回作成して使用した実際のスクリプトです。
#!/bin/bash
#ユーザー:パスワードの形式(実際に使用するユーザー名とパスワードに変更してください)
USER_LIST=(
"users_01:Passwd001"
"users_02:Passwd002"
"users_03:Passwd003"
)
for ENTRY in "${USER_LIST[@]}"; do
USER=$(echo "$ENTRY" | cut -d: -f1)
PASS=$(echo "$ENTRY" | cut -d: -f2)
echo "=== Processing $USER ==="
#ユーザー作成
useradd -m "$USER"
#パスワード設定
echo "$USER:$PASS" | chpasswd
#ホームディレクトリの権限設定
chmod 700 /home/$USER
chown $USER:$USER /home/$USER
#sudo権限
echo "$USER ALL = NOPASSWD: ALL" > "/etc/sudoers.d/$USER"
chmod 440 "/etc/sudoers.d/$USER"
#SSH設定
SSH_DIR="/home/$USER/.ssh"
mkdir -p "$SSH_DIR"
chmod 700 "$SSH_DIR"
chown "$USER:$USER" "$SSH_DIR"
#公開鍵と秘密鍵を生成
sudo -u "$USER" ssh-keygen -t rsa -b 2048 -f "$SSH_DIR/id_rsa" -N ""
chmod 600 "$SSH_DIR/id_rsa"
chmod 644 "$SSH_DIR/id_rsa.pub"
chown "$USER:$USER" "$SSH_DIR/"*
cat "$SSH_DIR/id_rsa.pub" >> "$SSH_DIR/authorized_keys"
chmod 600 "$SSH_DIR/authorized_keys"
chown "$USER:$USER" "$SSH_DIR/authorized_keys"
done
visudo -c
今回は難しいことは一切していませんのでスクリプト内容もシンプルにできました。
変えるべき点はほぼございません。作成予定分のユーザー名とパスワードのみ書き出してください。
あとは個人的に変えたい部分(例えば権限など)はご自身で修正していただければと思います。
構築手順
ここからは実際の構築フローを紹介してきます。今回はTeraTermで作業していきます。
まずはじめに作業するサーバーにSSH接続していただきます。
接続していただいたあとはsudoに変更します。
sudo su -
root権限に変更されていればOKです。
その後作業するルート配下にcdで移動してください。私はroot配下で作業しますのでそのままにしております。
次は以下のコマンドを実行してファイルを作成してください。
touch create_user.sh
シェルスクリプト用のファイルを作成しました。
名前は分かりやすければ何でもよろしいですが、必ず末尾に.shを付けてください。
作成後はllやlsコマンドでファイルの存在を確認します。

ファイルの存在を確認できたら、次は作成したファイルを編集していきます。
vi create_user.sh
実行していただくとさきほど作成した「create_user.sh」の書き込み画面へ入ります。
入っていただいたらキーボードの「i」キーを押していただいて挿入(もしくはinsert)と表示されます。

ユーザー名とパスワードの部分をしっかり確認し問題がなければControl + Cを押します。
すると先程の挿入(もしくはinsert)という表示が消えるのを確認します。再び「i」キーを押さない限りは書いた内容を編集できません。
書いた内容を確認し、問題がなければ:wqと入力してviを抜けます。(wqの前に:(コロン)が含まれます)
通常の画面に戻っていただいたら、catコマンドで先程の設定内容の確認をしていきます。
cat create_user.sh

最後の行まで確認し、無事編集した内容が保存されていればOKです。
次は先程作成したファイルをスクリプトに権限を付与していきます。
chmod 700 create_user.sh
実行後は改めてllやlsコマンドで確認していきます。

先程まで操作してたcreate_user.shが緑色になっていればOKです。
環境によっては色がない場合もありますが、その場合は左にあるrwxの部分を確認してください。
問題がなければ実際に実行していきます。以下のコマンドを入力してください。
./create_user.sh

(鍵の識別情報ですので念の為隠しておきます)
これで複数ユーザーがログイン可能状態まで一気に作成できました。
あとは無事作成され、ログインが出来るか確認していきます。
作成されたユーザーを確認
最後に作成されたユーザーがそれぞれ適切な設定がされているか、ログインができる確認していきます。
まずはユーザーの確認をします。
cat /etc/passwd | grep [作成したユーザー名に共通名があれば記入してください]

無事作成できてるのが確認できました。
次はユーザーディレクトリを確認します。
ll /home

無事問題なく作成されていますね。
ここで特に左側の権限周りとグループを確認してください。
権限がdrwx(700)になっていて、その横にあるグループ名がユーザー名と一致していればOKです。
次はsudo権限を確認していきます。
su - [作成したユーザー名]
その後に以下のコマンドを入力してください。
sudo whoami
実行結果がrootになっていればOKです。

確認できればControl + Dで元のアカウントまでログアウトしてください。
次はsudoersファイルの構文をチェックします。
まずは存在を確認するため、以下のコマンドを実行しください。
ll /etc/sudoers.d/

一部関係ないユーザーがありますので隠してます。
先程作成したユーザー分のファイルがあるのを確認しました。
ユーザーディレクトリ同様、権限を確認し、r--r(440)権限で読み取り専用になっているのも確認してください。
catコマンドで実際にファイルの中身も確認します。
cat /etc/sudoers.d/[作成したユーザー名]

このようになっていればOKです。
では最後に公開鍵・秘密鍵の確認をしていきます。
先程のユーザーディレクトリの中を見ていきます。以下のコマンドで確認をしてください。
ls -la /home/[作成したユーザー名]/.ssh

公開鍵のファイル(authorized_keysとid_rsa.pub)と秘密鍵のファイル(id_rsa)があるのが確認できました。
次はcatで中身を確認します。
cat /home/[作成したユーザー名]/.ssh/id_rsa
鍵情報ですので結果は貼れませんが、公開鍵のファイル(authorized_keysとid_rsa.pub)には数行の公開鍵が入っていて、秘密鍵のファイル(id_rsa)には以下のような情報が入っています。
-----BEGIN OPENSSH PRIVATE KEY-----
・
・
・
長い文字が沢山
・
・
・
-----END OPENSSH PRIVATE KEY-----
これをコピーしてメモ帳に貼り付けると秘密鍵として使うpemファイルを作成できます。
作成時ですが、END OPENSSH PRIVATE KEYのあとに1行だけ改行を入れないと秘密鍵が認識されませんので保存の際はご注意ください。

保存時には必ず末尾を.pemにして、すべてのファイルにしてください。
これで秘密鍵が完成しましたので実際に作成したユーザーでサーバーログインしてみます。
サーバーのIPアドレスを入力していただきます。

その後作成したユーザー名と秘密鍵を指定します。

OKを押していただくと。。。

無事ログインができました!!
これでアカウントの確認手順は終了です。
これらの手順を作成したアカウントの分だけ行ってください。
オマケ:シェルスクリプトと秘密鍵の削除
最後におまけになりますが、アカウントがすべてログインできるのを確認したら最初に作ったシェルスクリプトは削除します。
ユーザー名の横にパスワードを書いてたりしてセキュリティ的によろしくないためです。
削除前に必ずアカウントごとのパスワードと秘密鍵は保管してください!
パスワードが保管できたらllかlsコマンドでシェルスクリプトの場所を確認します。

確認できたら削除していきます。
rm create_user.sh

削除される前に確認されますので問題なければyes(yのみで可)を入力してください。
再びllかlsコマンドで確認にしてみます。

無事削除されましたね。この調子で秘密鍵も削除していきます。
まずは秘密鍵の場所を確認します。
ll /home/[作成したユーザー名]/.ssh

秘密鍵のファイル(id_rsa)の方を削除していきます。
以下のコマンドを実行してください。
rm /home/[作成したユーザー名]/.ssh/id_rsa

先程と同様に削除前に確認されますのでyes(yでも可)を入力してください。
実行後は再び鍵の存在を確認します。

秘密鍵のファイルが消えましたのでこれで完了です。こちらを全ユーザー分実行してください。
すべての秘密鍵を削除したら完了です。セキュリティ的にも安心なサーバーになりました。
ちなみに公開鍵のファイルが現在authorized_keysとid_rsa.pubの2つございます。
こちらも上記と同じ秘密鍵の削除手順消せますので削除推奨です。削除する際に注意していただくのは、消すのはid_rsa.pubの方を消してください。
まずは同様に作成した公開鍵の場所を確認します。
ll /home/[作成したユーザー名]/.ssh

次はこの2つのファイルの中身が本当に同じ内容なのかを確認します。
以下のコマンドを実行してください。
diff /home/[作成したユーザー名]/.ssh/authorized_keys /home/[作成したユーザー名]/.ssh/id_rsa.pub
実行してみた結果何も表示されなければこの2つのファイルは同じ内容ということです。
もし何かしらの文字が出力されたらこの出力された部分が2つのファイルと見比べて違う内容が書かれているということになります。
この2つが同じ中身ということを確認できましたので、次は「id_rsa.pub」の方を削除していきます。
以下のコマンドで削除を実行してください。
rm /home/[作成したユーザー名]/.ssh/id_rsa.pub

先程と同様に削除前に確認されますのでyes(yでも可)を入力してください。
実行後は再び鍵の存在を確認します。

公開鍵のファイルが消えましたのでこれで完了です。こちらを全ユーザー分実行してください。
すべて完了したらOKです。これにてサーバー上の作業は終了です。
その後は秘密鍵を作成したあと同様にすべてのユーザーのログインを確認してください。
ログインが無事出来れば構築・確認は完了です。お疲れ様でした。
最後に
いかがだったでしょうか。
複数人追加までは行かなくても、ある程度作成方法や要件が固定されていればシェルスクリプトを使えばテンプレート化してミスも減るんじゃないかなーと思いました。
といいつつ、私はホームディレクトリ配下にあるユーザーディレクトリを読み取り専用権限に変えてしまって、一生SSHログインできないというミスをしました。トホホ…
こういうことがない限りはおそらく安心してログインできると思いますので皆様も確認・チェックは怠らないで毎日の構築ライフを過ごしていただければと思います!(自戒の念を込めて)
それではまたどこかでお会いしましょう。
文系エンジニア見習いです。