サーバーの移行Prjでセキュリティ上、今までのユーザーのパスワードを変更する要望があったので、まとめてパスワードを変更する
やってみたので、メモとして残す。
環境
- AWS EC2
- RHEL8.8
bashスクリプト説明
- Linuxユーザーのパスワードを変更するスクリプト
- CSVファイルのユーザー名と新しいパスワードに基づいて、ユーザーのパスワードを変更する。
前提
- csvファイルを用意
- 形式 ユーザー名,パスワード ファイル名はなんでも可 例)user_password.csv
- 以下記述の.shのスクリプトを用意 名前例./change_password_script.sh
実行方法
sudo bash ./change_password_script.sh user_password.csv
ヘルプオプションをつけると説明を表示する
sudo bash ./change_password_script.sh --help
パスワードを変更するスクリプト
#!/bin/bash
# 説明
## Linuxユーザーのパスワードを変更するスクリプト
## CSVファイルのユーザー名と新しいパスワードに基づいて、ユーザーのパスワードを変更する。
# 前提
## ファイル名なんでも可のcsvファイルを用意(例user_password.csv)
## 形式 ユーザー名,パスワード
# 実行
## sudo bash ./change_password_script.sh user_password.csv
## helpオプションをつけて説明を表示
## sudo bash ./change_password_script.sh --help
# ヘルプメッセージ
help_message="使用方法: $0 <csv_ファイル>
CSVファイル内のユーザーのパスワードを変更します。
CSVファイルの形式: ユーザー名,パスワード"
# ヘルプ関数
show_help() {
echo "$help_message"
exit 0
}
# 引数が0の場合、ヘルプメッセージを表示して終了
if [ $# -eq 0 ]; then
show_help
fi
# 引数からCSVファイルのパスを受け取る
csv_file="$1"
# ヘルプオプションが指定された場合、ヘルプメッセージを表示して終了
if [ "$csv_file" == "--help" ] || [ "$csv_file" == "-h" ]; then
show_help
fi
# CSVファイルが存在しない場合、エラーメッセージを表示して終了
if [ ! -f "$csv_file" ]; then
echo "エラー: 指定されたCSVファイル '$csv_file' が存在しません。"
exit 1
fi
# CSVファイルからユーザー名と新しいパスワードを読み取り、変更します。
while IFS=',' read -r user password; do
# ユーザーが存在するか確認
if ! id "$user" &>/dev/null; then
echo "エラー: ユーザー '$user' が存在しません。"
continue
fi
# パスワードを変更
echo -e "$password\n$password" | passwd "$user" 2>/dev/null
if [ $? -eq 0 ]; then
echo "ユーザー $user のパスワードを変更しました。"
else
echo "エラー: ユーザー $user のパスワードの変更に失敗しました。"
fi
done < "$csv_file"
# スクリプトの実行が完了しました。
echo "スクリプトの実行が完了しました。"
一応以下2つのエラーハンドリングも追加してます。
- ユーザーが存在しない
- パスワードが有効でない(8桁以上じゃないとパスワード変更できない、メッセージは一般的なメッセージ)
AWSでテストをする
-
SSHでEC2インスタンスに接続:
ssh -i ~/.ssh/公開鍵.pem ec2-user@パブリックIPアドレス
-
ユーザーを作成:
試したいだけなので、なんでもいいので、user1とかにしてます。sudo useradd user1 sudo useradd user2 sudo useradd user3
-
パスワードを設定:
パスワードの入力を2回求められます。8桁以上sudo passwd user1
検証について
スクリプト実行後パスワードがちゃんと設定されているか確認のため、公開鍵ではなく、パスワードで認証するように変更する。
-
SSHサーバーのパスワード認証を可能にする:
sudo vi /etc/ssh/sshd_config
この行を見つけて、コメントアウトを削除
PasswordAuthentication yes
-
SSHサービスを再起動:
変更を反映させるためにSSHサービスを再起動。sudo systemctl restart sshd
これで準備ができた。
シェルスクリプト作成&実行
シェルスクリプト作成
$ vi change_password_script.sh
$ cat change_password_script.sh
上で書いたスクリプトが表示されればOK
シェルスクリプト実行
$ sudo bash change_password_script.sh --help
使用方法: change_password_script.sh <csv_ファイル>
CSVファイル内のユーザーのパスワードを変更します。
CSVファイルの形式: ユーザー名,パスワード
helpコマンドでちゃんとhelpメッセージが出ることを確認
csvファイルを置く
$ vi user_password.csv
$ cat user_password.csv
user1,test1test1
user2,test2test2
user3,test3test3
スクリプト実行
$ sudo bash ./change_password_script.sh user_password.csv
Changing password for user user1.
New password: BAD PASSWORD: The password fails the dictionary check - it does not contain enough DIFFERENT characters
Retype new password: passwd: all authentication tokens updated successfully.
ユーザー user1 のパスワードを変更しました。
Changing password for user user2.
New password: BAD PASSWORD: The password fails the dictionary check - it does not contain enough DIFFERENT characters
Retype new password: passwd: all authentication tokens updated successfully.
ユーザー user2 のパスワードを変更しました。
Changing password for user user3.
New password: BAD PASSWORD: The password fails the dictionary check - it does not contain enough DIFFERENT characters
Retype new password: passwd: all authentication tokens updated successfully.
ユーザー user3 のパスワードを変更しました。
スクリプトの実行が完了しました。
実行できた。
一度ログアウトして、userでログインできるか試す。
>ssh user1@パブリックIPアドレス
user1@パブリックIPアドレス's password:
ログインできればちゃんとパスワードが変更されている。