Linuxのアカウント管理

Linuxでは、利用者やサービスを識別するためにユーザーアカウントを使用します。また、複数のユーザーをまとめて権限を管理するためにグループを使用します。

アカウント管理では、主に次の操作を行います。

  • ユーザーアカウントの作成・変更・削除
  • グループの作成・変更・削除
  • パスワードの設定とロック
  • パスワードやアカウントの有効期限の設定
  • UID、GID、ホームディレクトリ、ログインシェルの管理

これらの情報は、主に次のファイルに保存されます。

ファイル保存される主な情報
/etc/passwdユーザー名、UID、GID、ホームディレクトリ、ログインシェル
/etc/shadowパスワードハッシュ、パスワードやアカウントの有効期限
/etc/groupグループ名、GID、所属ユーザー
/etc/gshadowグループパスワードやグループ管理者など
/etc/skel新しいユーザーのホームディレクトリへコピーするひな型ファイル

ユーザーアカウントとUID

Linuxはユーザーを、ユーザー名ではなくUID(User ID)で識別します。

例えば、taroというユーザー名を変更しても、UIDが変わらなければファイルの所有者としては同じユーザーとして扱われます。

現在のユーザーのUIDや所属グループは、idコマンドで確認できます。

id

特定のユーザーを指定することもできます。

id taro

実行結果の例は次のとおりです。

uid=1001(taro) gid=1001(taro) groups=1001(taro),10(wheel)
  • uid:ユーザーのUID
  • gid:プライマリグループのGID
  • groups:所属しているすべてのグループ

UIDの割り当て範囲はディストリビューションや設定によって異なるため、「一般ユーザーは必ず1000以上」などと断定しないように注意してください。


プライマリグループと補助グループ

ユーザーには、次の2種類のグループがあります。

プライマリグループ

ユーザーが必ず1つ所属する基本グループです。

プライマリグループのGIDは、/etc/passwdの第4フィールドに記録されます。ユーザーがファイルを新規作成したとき、そのファイルのグループ所有者として通常使用されます。

補助グループ

プライマリグループ以外に追加で所属するグループです。

補助グループの所属情報は、主に/etc/groupの第4フィールドに記録されます。


ユーザーアカウントを管理するコマンド

useradd――ユーザーの作成

useraddコマンドは、新しいユーザーアカウントを作成します。

useradd ユーザー名

代表的なオプションは次のとおりです。

オプション説明
-u UIDUIDを指定する
-g グループプライマリグループを指定する
-G グループ一覧補助グループを指定する
-d ディレクトリホームディレクトリを指定する
-mホームディレクトリを作成する
-s シェルログインシェルを指定する
-c コメントコメント欄を設定する
-e 日付アカウントの有効期限を指定する
-rシステムアカウントを作成する
-Duseraddのデフォルト値を表示・変更する

例えば、ホームディレクトリを作成し、ログインシェルと補助グループを指定する場合は次のように実行します。

useradd -m -s /bin/bash -G developers taro

useraddによってホームディレクトリを自動作成するかどうかは、ディストリビューションや設定によって異なります。確実に作成する場合は、-mを明示します。

ユーザー作成後は、passwdコマンドでパスワードを設定します。

passwd taro

usermod――ユーザー情報の変更

usermodコマンドは、既存のユーザーアカウントを変更します。

usermod オプション ユーザー名

代表的なオプションは次のとおりです。

オプション説明
-l 新ユーザー名ログイン名を変更する
-u UIDUIDを変更する
-g グループプライマリグループを変更する
-G グループ一覧補助グループを変更する
-a -G グループ一覧既存の所属を維持したまま補助グループへ追加する
-d ディレクトリホームディレクトリのパスを変更する
-m-dと併用してホームディレクトリの内容を移動する
-s シェルログインシェルを変更する
-Lパスワードをロックする
-Uパスワードのロックを解除する

ユーザーを補助グループへ追加する場合は、次のように実行します。

usermod -aG developers taro

特に重要なのが、-aGと-Gの違いです。

usermod -G developers taro

-aを付けずに-Gを使用すると、現在の補助グループ一覧が指定した内容に置き換えられます。既存の所属グループを維持して追加する場合は、-aGを使用します。

ホームディレクトリの名前と内容を変更する場合は、次のように実行します。

usermod -d /home/jiro -m taro

なお、-lでユーザー名を変更しただけでは、ホームディレクトリの名前は自動的には変更されません。


userdel――ユーザーの削除

userdelコマンドは、ユーザーアカウントを削除します。

userdel taro

通常、オプションなしではホームディレクトリやメールスプールなどは残ります。

ホームディレクトリなどもあわせて削除する場合は、-rオプションを使用します。

userdel -r taro

ただし、そのユーザーが所有しているすべてのファイルが自動的に削除されるわけではありません。ホームディレクトリ以外に残った所有ファイルは、必要に応じてfindコマンドなどで確認します。


グループを管理するコマンド

groupadd――グループの作成

新しいグループを作成します。

groupadd developers

GIDを指定する場合は、-gオプションを使用します。

groupadd -g 2000 developers

groupmod――グループ情報の変更

既存のグループを変更します。

groupmod オプション グループ名

代表的なオプションは次のとおりです。

オプション説明
-n 新グループ名グループ名を変更する
-g GIDGIDを変更する

グループ名を変更する例は次のとおりです。

groupmod -n development developers

groupdel――グループの削除

グループを削除します。

groupdel developers

通常、既存ユーザーのプライマリグループとして使用されているグループは、そのままでは削除できません。先にユーザーのプライマリグループを変更する必要があります。

gpasswd――グループパスワードの管理

gpasswdは、グループのメンバーや管理者、グループパスワードを管理するコマンドです。設定は主に/etc/groupと/etc/gshadowへ反映されます。
書式: gpasswd [オプション] グループ名

オプション説明実行例
-a ユーザーユーザーをグループへ追加gpasswd -a user1 sales
-d ユーザーユーザーをグループから削除gpasswd -d user1 sales
-A ユーザー一覧グループ管理者を設定gpasswd -A user1 sales
-M ユーザー一覧グループメンバーを一括設定gpasswd -M user1,user2 sales
オプションなし指定グループのパスワードを設定gpasswd sales

通常、メンバーの追加・削除には管理者権限が必要です。-Mは既存のメンバー一覧を置き換える点に注意します。

newgrpコマンド――プライマリグループを一時的に変更

newgrpは、新しいシェルを起動し、そのシェルで使用するプライマリグループを一時的に変更するコマンドです。
書式: newgrp [-] [グループ名]

指定例動作
newgrp developersプライマリグループをdevelopersへ変更
newgrp - developersログイン時のように環境を初期化して変更
newgrpログイン時のプライマリグループへ戻す

変更後は、原則として新規作成するファイルのグループ所有者にも反映されます。
所属していないグループへ変更する場合、/etc/gshadowに設定されたグループパスワードを要求されることがあります。
起動したシェルをexitで終了すると、変更前のグループ環境へ戻ります。


パスワードの管理

passwdコマンド

passwdコマンドは、ユーザーのパスワードを設定・変更するために使用します。

一般ユーザーが引数なしで実行すると、自分自身のパスワードを変更します。

passwd

管理者は、ユーザー名を指定してほかのユーザーのパスワードを変更できます。

passwd taro

代表的なオプションは次のとおりです。

オプション説明
-lパスワードをロックする
-uパスワードのロックを解除する
-Sパスワードの状態を表示する
-eパスワードを直ちに期限切れにする

パスワードをロックする場合は、次のように実行します。

passwd -l taro

解除する場合は、次のように実行します。

passwd -u taro

passwd -lやusermod -Lは、基本的にパスワードを使用した認証をロックする操作です。SSH公開鍵認証など、パスワード以外のログイン方法まで必ず無効になるわけではありません。


パスワードとアカウントの有効期限

chageコマンド

画像

chageコマンドは、パスワードの有効期限やアカウントの有効期限を確認・変更するために使用します。

現在の設定を確認するには、-lオプションを使用します。

chage -l taro

代表的なオプションは次のとおりです。

オプション説明
-d 日付パスワードの最終変更日を設定する
-m 日数パスワードを再変更できるまでの最短日数を設定する
-M 日数パスワードの最長有効日数を設定する
-W 日数期限切れ前の警告日数を設定する
-I 日数パスワード期限切れ後にアカウントを無効にするまでの日数を設定する
-E 日付アカウント自体の有効期限を設定する
-l現在の設定を一覧表示する

次回ログイン時にパスワード変更を要求する場合は、最終変更日を0に設定します。

chage -d 0 taro

パスワードの有効期限と、アカウント自体の有効期限は別の設定です。

  • -M:パスワードの有効期限
  • -E:アカウント自体の有効期限

この違いは試験でも重要です。


アカウント情報を保存するファイル

/etc/passwd

/etc/passwdは、ユーザーアカウントの基本情報を保存するファイルです。

1行につき1ユーザーが記録され、コロン(:)で区切られた7個のフィールドで構成されます。

taro:x:1001:1001:Taro User:/home/taro:/bin/bash
番号フィールド説明
1ユーザー名ログインに使用する名前
2パスワード通常はxが入り、実際の情報は/etc/shadowに保存される
3UIDユーザーID
4GIDプライマリグループのGID
5コメント氏名や説明など
6ホームディレクトリログイン後のホームディレクトリ
7ログインシェルログイン時に起動するシェル

シャドウパスワードを使用する一般的な環境では、第2フィールドにはxが入ります。ただし、環境やアカウントの状態によっては、必ずしもxとは限りません。


/etc/shadow

画像

/etc/shadowは、パスワードハッシュと、パスワード・アカウントの有効期限を保存するファイルです。

パスワードハッシュを一般ユーザーから保護するため、/etc/passwdよりも厳しいアクセス権が設定されています。

1行につき1ユーザーが記録され、コロン区切りの9個のフィールドで構成されます。

taro:$6$...:20000:0:99999:7:::
番号フィールド説明
1ユーザー名/etc/passwdのユーザー名に対応する
2パスワードパスワードハッシュやロック状態
3最終変更日1970年1月1日からパスワードを最後に変更した日までの日数
4最短変更間隔再度パスワードを変更できるまでの日数
5最長有効日数パスワードを使用できる最長日数
6警告期間期限切れ前に警告を表示する日数
7非アクティブ期間パスワード期限切れ後にアカウントを無効化するまでの日数
8アカウント有効期限1970年1月1日から有効期限までの日数
9予約フィールド将来の拡張用

第2フィールドの先頭に!が付いている場合や、*など有効なパスワードハッシュではない値が設定されている場合は、通常、そのパスワードを使った認証はできません。

ただし、これは必ずしもアカウントへのすべてのログイン方法を無効にするという意味ではありません。


/etc/group

/etc/groupは、グループ情報を保存するファイルです。

1行につき1グループが記録され、コロン区切りの4個のフィールドで構成されます。

developers:x:2000:taro,jiro
番号フィールド説明
1グループ名グループの名前
2グループパスワード通常はxなどが入る
3GIDグループID
4メンバー補助グループとして所属するユーザーの一覧

第4フィールドには、主に補助グループとして所属するユーザーが記録されます。ユーザーのプライマリグループは、/etc/passwdの第4フィールドで確認します。


/etc/gshadow

/etc/gshadowは、/etc/groupに対応するシャドウファイルです。

グループパスワード、グループ管理者、グループメンバーなどの情報を保存します。/etc/shadowと同様に、一般ユーザーからは読み取れないよう厳しいアクセス権が設定されます。

試験対策では、次の対応関係を押さえておきましょう。

  • ユーザー情報:/etc/passwd
  • ユーザーのパスワード情報:/etc/shadow
  • グループ情報:/etc/group
  • グループの保護された情報:/etc/gshadow

アカウント情報の確認

getentコマンド

getentコマンドを使用すると、システムが参照しているアカウントデータベースから情報を取得できます。

ユーザー情報を一覧表示する場合は、次のように実行します。

getent passwd

特定のユーザーだけを確認することもできます。

getent passwd taro

グループ情報を確認する場合は、次のように実行します。

getent group developers

ローカルファイルだけを直接確認するcat /etc/passwdとは異なり、getentはシステムに設定されたアカウント情報の参照方法に従って結果を表示します。


新規ユーザー作成時のデフォルト設定

/etc/skel

/etc/skelは、新しいユーザーのホームディレクトリへコピーするひな型ファイルを保存するディレクトリです。

例えば、次のようなファイルが配置されています。

/etc/skel/.bash_profile
/etc/skel/.bashrc
/etc/skel/.bash_logout

useradd -mなどによってホームディレクトリが作成されると、通常、/etc/skelの内容が新しいホームディレクトリへコピーされます。

/etc/skelを変更しても、すでに存在するユーザーのホームディレクトリには自動反映されません。


/etc/default/useradd

/etc/default/useraddには、useraddが使用するデフォルト値が保存されます。

代表的な設定には、次のようなものがあります。

  • ホームディレクトリの基準となるディレクトリ
  • デフォルトのログインシェル
  • アカウントの有効期限
  • パスワード期限切れ後の非アクティブ期間
  • /etc/skelの場所

現在のデフォルト値は、次のコマンドでも確認できます。

useradd -D

/etc/login.defs

/etc/login.defsは、アカウント作成やログインに関する各種デフォルト値を定義するファイルです。

代表的な設定項目は次のとおりです。

設定項目説明
PASS_MAX_DAYSパスワードの最長有効日数
PASS_MIN_DAYSパスワードの最短変更間隔
PASS_WARN_AGE期限切れ前の警告日数
UID_MIN、UID_MAX一般ユーザーに割り当てるUIDの範囲
GID_MIN、GID_MAX一般グループに割り当てるGIDの範囲

これらは主に、新しいアカウントを作成するときの初期値として使用されます。

/etc/login.defsを変更しても、既存ユーザーの/etc/shadowなどの設定が自動的に変更されるわけではありません。既存ユーザーのパスワード有効期限を変更する場合は、chageなどを使用します。


システムアカウント

Linuxでは、実際の利用者だけでなく、サービスやデーモンを実行するためのシステムアカウントも使用されます。

システムアカウントを作成する場合は、useradd -rを使用します。

useradd -r serviceuser

サービス専用アカウントでは、対話的なログインを必要としないことが一般的です。その場合は、ログインシェルとして/usr/sbin/nologinなどを指定します。

useradd -r -s /usr/sbin/nologin serviceuser

/usr/sbin/nologinのパスはディストリビューションによって異なる場合があります。

システムアカウントでは、次のような設定が一般的です。

  • システムアカウント用のUIDを使用する
  • パスワードをロックする
  • ログインシェルをnologinにする
  • 必要最小限のグループだけに所属させる

UIDの具体的な範囲は環境によって異なるため、固定値ではなく/etc/login.defsなどの設定を確認します。