はじめに
この実験では、Linux システムでユーザーアカウントを管理するための不可欠なスキルを習得します。新規アカウントの作成とセキュリティ保護から、属性の変更、そして最終的な安全な削除まで、ユーザー管理のライフサイクル全体を実践します。この実習経験は、マルチユーザー環境の Linux システムを維持するシステム管理者にとって極めて重要です。
まず、useradd コマンドを使用して新しいユーザーとホームディレクトリを作成し、passwd でアカウントを保護することから始めます。次に、ユーザーを切り替える際の su と su - の違いを調査し、アカウントのロックとロック解除の方法を学びます。また、chage によるパスワードの有効期限ポリシーの設定や、usermod によるグループ所属の変更など、ユーザー属性の修正も行います。実験の最後には、userdel コマンドを使用して、ユーザーとその関連データを適切に削除する方法を確認します。
useradd と passwd によるユーザーの作成と保護
このステップでは、useradd コマンドを使用して新しいユーザーアカウントを作成し、passwd コマンドでパスワードを設定してアカウントを保護する方法を学びます。これらは Linux システムを管理する上での基本的な管理タスクです。
まず、student1 という名前の新しいユーザーを作成しましょう。useradd コマンドでユーザーを作成するにはルート権限(root privileges)が必要なため、コマンドの前に sudo を付ける必要があります。
ターミナルで次のコマンドを実行してください。
sudo useradd -m student1
-m オプションは重要です。これは useradd に対して、ユーザーのホームディレクトリ(デフォルトでは /home/student1)を作成するように指示します。-m を使用しない場合、ユーザーは作成されますが、ファイルを保存するための個人のホームディレクトリが作成されません。
コマンドを実行すると、システムはいくつかの重要なシステムファイルに新しいユーザーのエントリを作成します。grep コマンドを使用して、/etc/passwd、/etc/shadow、/etc/group ファイルの中から student1 で始まる行を検索することで、これを確認できます。/etc/shadow の読み取りにはルート権限が必要なため、sudo を使用します。
sudo grep ^student1 /etc/passwd /etc/shadow /etc/group
出力は以下のようになります。ユーザー ID (UID) やグループ ID (GID) の数値は異なる場合がありますが、構造は同じです。
/etc/passwd:student1:x:5001:5001::/home/student1:/bin/sh
/etc/shadow:student1:!:20265:0:99999:7:::
/etc/group:student1:x:5001:
この出力の内容を解説します。
/etc/passwd: ユーザーアカウントの基本情報が含まれています。2 番目のフィールドのxは、暗号化されたパスワードがここではなく、セキュリティのために/etc/shadowファイルに保存されていることを示します。/etc/shadow: セキュアなユーザーアカウント情報が含まれています。2 番目のフィールドは最初は!または*になっており、パスワードがまだ設定されておらず、アカウントがログインに使用できないことを示しています。/etc/group: このユーザーのプライマリグループとして、student1という名前の新しいグループが自動的に作成されました。
ユーザーが作成されたので、アカウントを使用可能かつ安全にするためにパスワードを設定する必要があります。これには passwd コマンドを使用します。useradd と同様に、他のユーザーのパスワードを変更する場合は sudo が必要です。
sudo passwd student1
システムから student1 の新しいパスワードの入力と再入力を求められます。この実験では、パスワードとして student1pass を使用してください。セキュリティ上の理由から、入力した文字は画面に表示されないことに注意してください。
New password:
Retype new password:
passwd: password updated successfully
パスワードが設定されたので、/etc/shadow ファイルを再度チェックして何が変わったか確認しましょう。
sudo grep ^student1 /etc/shadow
出力が変化しているはずです。... の部分は、長くユニークな文字列を表しています。
student1:$y$j9T$lUM1RtLPQdrCOHmaFf1po/$xqNw.5dz54yR9whxsID9teI28/BOyvKocK5dA9X7GoD:20265:0:99999:7:::
2 番目のフィールドに、長く複雑な文字列が含まれていることに注目してください。これは、設定したパスワードのハッシュ化(暗号化)されたバージョンです。これでアカウントが有効になり、ログインできるようになりました。
su と su - によるユーザーの切り替えと環境の違いの理解
このステップでは、su(substitute user)コマンドを使用して、現在のターミナルセッション内で別のユーザーアカウントに切り替える方法を学びます。また、-(または --login)フラグを使用する場合と使用しない場合で、ユーザー環境にどのような重大な違いが生じるかを学びます。
まず、labex ユーザーとしての現在の環境を確認しましょう。次のコマンドを実行して、現在のユーザー、ホームディレクトリ、および作業ディレクトリを表示します。
whoami
echo $HOME
pwd
次のような出力が表示され、プロジェクトディレクトリにいる labex ユーザーであることが確認できます。
labex
/home/labex
/home/labex/project
次に、前のステップで作成した student1 ユーザーに切り替えてみましょう。su コマンドの後にユーザー名を指定します。student1 のパスワード(student1pass)を求められます。
su student1
パスワードを入力すると、セッションは student1 の ID で動作します。しかし、環境は完全にはロードされていません。同じコマンドを再度実行して、何が変わり、何が変わっていないかを確認しましょう。
whoami
echo $HOME
pwd
出力に注目してください。
student1
/home/student1
/home/labex/project
この結果から以下のことがわかります。
whoami: 実質的にstudent1になっています。echo $HOME:HOME環境変数は新しいユーザー(student1)のホームディレクトリを指しています。pwd: ユーザーを切り替える前と同じディレクトリ(/home/labex/project)に留まっています。
この挙動は問題を引き起こす可能性があります。スクリプトやアプリケーションが設定ファイルを探す際に HOME 変数に依存している場合、予期しない動作を招くことがあるからです。
ここで exit と入力して、labex ユーザーのシェルに戻ります。
exit
次に、今度は - フラグを付けてユーザーを切り替えてみましょう。このフラグは su に対して「ログインシェル」を開始するように指示し、新しいユーザーでのフルログインをシミュレートします。つまり、ホームディレクトリやシェルプロファイルを含む、student1 の完全な環境がロードされます。
su - student1
再度パスワード(student1pass)を入力します。そして、同じ診断コマンドを実行します。
whoami
echo $HOME
pwd
前の試行結果と比較してください。
student1
/home/student1
/home/student1
違いは明らかです。
whoami: 引き続きstudent1です。echo $HOME:HOME変数は/home/student1を指しています(suの時と同じです)。pwd: 現在の作業ディレクトリがstudent1のホームディレクトリに変更されています。
これは、コマンドラインでユーザーを切り替える際には su - <ユーザー名> が推奨される方法であることを示しています。これにより、新しいユーザーにクリーンで予測可能な環境が提供され、パスや権限の誤りによるトラブルを防ぐことができます。
このステップを終了するには、exit と入力して元の labex セッションに戻ります。
exit
passwd -l と passwd -u によるユーザーアカウントのロックと解除
このステップでは、ユーザーアカウントをロックして一時的に無効化し、その後ロックを解除して再度有効化する方法を学びます。これは、ユーザーのアカウントやファイルを削除せずに、ログインだけを禁止したい場合に一般的に行われる管理手法です。
まず、student1 アカウントをロックしましょう。これを行うには、passwd コマンドに -l(lock)オプションを付けて使用します。この操作には管理者権限が必要なため、sudo を使用する必要があります。
sudo passwd -l student1
コマンドを実行すると、パスワードがロックされたことが確認されます。出力メッセージは多少異なる場合がありますが、成功したことが示されます。
passwd: password for user student1 changed.
では、「ロック」とは実際には何をしているのでしょうか? /etc/shadow ファイルを再度調べて、その効果を確認しましょう。
sudo grep ^student1 /etc/shadow
わずかですが重要な変化に気づくはずです。暗号化されたパスワード文字列の先頭に、1 つまたは 2 つの感嘆符(!)が付加されています。... は、あなたの環境固有のハッシュの残りの部分を表します。
student1:!$y$j9T$...:20265:0:99999:7:::
この ! プレフィックスは、保存されているパスワードハッシュを無効にします。これにより、システムはユーザーが提供したどのパスワードとも一致させることができなくなります。結果として、ユーザーはログインできなくなります。これをテストしてみましょう。student1 ユーザーに切り替えようとしてみてください。
su - student1
パスワードを求められますが、正しいパスワード(student1pass)を入力してもログインは失敗します。
Password:
su: Authentication failure
これでアカウントが正常にロックされていることが確認できました。次に、ロックを解除しましょう。アカウントを再度有効にするには、passwd コマンドの -u(unlock)オプションを使用してプロセスを逆にするだけです。
sudo passwd -u student1
再び、変更が確認されます。
passwd: password for user student1 changed.
最後にもう一度 /etc/shadow ファイルをチェックして、アカウントのロックが解除されていることを確認しましょう。
sudo grep ^student1 /etc/shadow
出力を見ると、! プレフィックスが削除され、元のパスワードハッシュが復元されていることがわかります。
student1:$y$j9T$...:20265:0:99999:7:::
これでアカウントは再びアクティブになりました。student1 ユーザーに正常に切り替えられることで、これを確認できます。プロンプトが表示されたらパスワード student1pass を入力してください。
su - student1
student1 としてログインできるはずです。最後に exit と入力して labex セッションに戻ります。
exit
chage と usermod によるパスワードの有効期限とグループ所属の変更
このステップでは、より高度なユーザープロパティを管理します。chage を使用してパスワードの有効期限を制御し、パスワードセキュリティポリシーを適用する方法と、usermod を使用してユーザーのグループ所属を管理し、権限やアクセス権を制御する方法を学びます。
まず、student1 アカウントのパスワード有効期限(エイジング)情報を確認しましょう。chage(change age)コマンドに -l(list)フラグを付けると、これらの詳細が表示されます。
sudo chage -l student1
出力には、アカウントのデフォルト設定が表示されます。日付はユーザーを作成した日に対応します。
Last password change : Dec 08, 2024
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
セキュリティ上、ユーザーに定期的なパスワード変更を求めるのは良い習慣です。パスワードを 90 日ごとに変更する必要があり(-M 90)、変更は 7 日に 1 回しか行えず(-m 7)、有効期限の 14 日前に警告が表示される(-W 14)というポリシーを設定してみましょう。
sudo chage -M 90 -m 7 -W 14 student1
設定を再度表示して、変更を確認します。
sudo chage -l student1
出力に新しいポリシーが反映されます。
Last password change : Dec 08, 2024
Password expires : Mar 08, 2025
Password inactive : never
Account expires : never
Minimum number of days between password change : 7
Maximum number of days between password change : 90
Number of days of warning before password expires : 14
次に、グループ所属を変更しましょう。ユーザーは 1 つのプライマリグループに属し、複数のセカンダリ(補助)グループに属することができます。ユーザーのグループは id コマンドで確認できます。
id student1
uid=5001(student1) gid=5001(student1) groups=5001(student1)
これは、student1 のプライマリグループが student1 (gid=5001) であり、まだセカンダリグループには属していないことを示しています。
developers という新しいグループを作成し、そこに student1 を追加しましょう。まず、グループを作成します。
sudo groupadd developers
次に、usermod を使用して student1 をこの新しいグループに追加します。-aG フラグは非常に重要です。-G はセカンダリグループを指定し、-a(append)は他のグループから削除せずにユーザーをグループに追加します。
sudo usermod -aG developers student1
ユーザーのグループを再度確認します。
id student1
出力に developers グループが含まれるようになりました。
uid=5001(student1) gid=5001(student1) groups=5001(student1),1002(developers)
もし -a フラグを忘れたらどうなるでしょうか?別のグループ testers を作成し、-G のみを使用して student1 を追加してみましょう。
sudo groupadd testers
sudo usermod -G testers student1
もう一度グループを確認します。
id student1
uid=5001(student1) gid=5001(student1) groups=5001(student1),1003(testers)
student1 が developers グループに属していないことに注目してください。-a なしで usermod -G を使用すると、既存のすべてのセカンダリグループが新しいリストで 置き換えられて しまいます。ユーザーを両方のグループに所属させるには、すべてのグループをリストするか(-G developers,testers)、追加フラグを使用する必要があります。正しく student1 を developers グループに再追加して修正しましょう。
sudo usermod -aG developers student1
最終的な状態を確認します。ユーザーは両方のグループのメンバーになっているはずです。
id student1
uid=5001(student1) gid=5001(student1) groups=5001(student1),1003(testers),1002(developers)
userdel と userdel -r によるユーザーとそのデータの削除
このステップでは、userdel コマンドを使用してシステムからユーザーアカウントを完全に削除する方法を学びます。単にユーザーのアカウント情報を削除する場合と、ホームディレクトリなどの関連するすべてのファイルと一緒にアカウントを削除する場合の重要な違いを確認します。
まず、両方の削除方法を実演するために、2 番目のユーザー student2 を作成しましょう。
sudo useradd -m student2
これで、student1(前のステップから)と新しい student2 の 2 つのユーザーが用意できました。
まず、特別なオプションを付けずに student1 ユーザーを削除してみましょう。デフォルトの userdel コマンドは、/etc/passwd や /etc/shadow などのシステムアカウントファイルからユーザーのエントリを削除しますが、ホームディレクトリは削除 しません。これは、ユーザーを完全に削除する前にデータをアーカイブする必要がある場合に便利です。
sudo userdel student1
ユーザーアカウントがなくなったことを確認するために、/etc/passwd を grep してみます。
grep ^student1 /etc/passwd
このコマンドは何も出力しません。これにより、ユーザーのアカウントエントリが削除されたことが確認できます。しかし、ホームディレクトリはどうでしょうか? /home/student1 がまだ存在するか確認しましょう。
ls -ld /home/student1
ディレクトリがまだ存在していることがわかります。ただし、システムがその ID をユーザー名にマップできなくなったため、所有者は数値(ユーザーの古い UID)として表示されます。
drwxr-x--- 2 5001 5001 78 Jun 26 08:18 /home/student1
次に、student2 ユーザーを削除しますが、今度は -r(remove)フラグを使用します。このオプションは userdel に対して、アカウントエントリに加えて、ユーザーのホームディレクトリとメールスプール(mail spool)も削除するように指示します。これは完全かつ取り消し不可能な削除です。
sudo userdel -r student2
メールスプールが見つからないという警告メッセージが表示されることがありますが、これはユーザーが一度もメールを受け取っていない場合には正常な動作です。
userdel: student2 mail spool (/var/mail/student2) not found
この警告はエラーではありません。単に削除すべきメールスプールファイルが存在しなかったことを意味しており、作成されたばかりのユーザーでは想定内のことです。
まず、/etc/passwd からアカウントエントリが消えていることを確認します。先ほどと同様、何も出力されないはずです。
grep ^student2 /etc/passwd
次に、最も重要な点として、ホームディレクトリ /home/student2 が存在するか確認します。
ls -ld /home/student2
今回はコマンドがエラーメッセージとともに失敗し、ディレクトリがユーザーアカウントと一緒に完全に削除されたことが証明されます。
ls: cannot access '/home/student2': No such file or directory
これで、ユーザーを削除する両方の方法を実践できました。必要に応じて、ユーザーのデータを保持するか、完全に消去するかを柔軟に選択できるようになりました。
まとめ
この実験では、Linux システムでユーザーアカウントを管理するための基本的なコマンドを学びました。まず useradd -m で新しいユーザーを作成し、ホームディレクトリも確実に作成されるようにしました。その後、passwd でパスワードを設定してアカウントを保護しました。su と su - の両方を使用してユーザーを切り替える練習を行い、標準シェルとログインシェルの環境における決定的な違いを学びました。また、passwd コマンドの -l および -u オプションを使用して、アカウントアクセスをロックおよび解除する方法も習得しました。
さらに、既存のユーザー属性の変更についても学習しました。chage を使用してパスワードの有効期限ポリシーを管理し、usermod を使用してユーザーのグループ所属を変更しました。最後に、システムからユーザーを削除するプロセスを調査し、ユーザーアカウントのみを削除する userdel コマンドと、ホームディレクトリやメールスプールも削除して完全にクリーンアップする userdel -r コマンドの違いを理解しました。



