ユーザ・グループ管理系のコマンド

はじめに

ユーザ

Linuxにおいてユーザとは、システムを利用する主体のことである。主体は人物だけとは限らず、ルートユーザ、システムユーザ、一般ユーザに大別される。

種類意味ユーザID
ルートユーザシステム全体を管理する権限を持つユーザ。
全ての権限を持つ。
0
システムユーザサービスやデーモンを動作させるためのユーザ。
通常、ログインすることはできず、動作に必要な権限だけを持つ。
1~999
一般ユーザ人がシステムを利用するためのユーザ。1000~(ただしnobodyにアサインされているものは除く)

nobody user

nobodyは一般ユーザよりも低い権限しか持たないユーザである。特権が必要ない利用方法において、万一攻撃されても影響を最低限に抑える目的などで利用される。ユーザIDとして65534などの最大値付近の値がアサインされているケースが多い。

グループ

Linuxにおいてグループとは、複数のユーザをまとめて、アクセス権限を効率的に管理するためのものである。システムグループと一般グループに大別される。

種類意味グループID
システムグループルートユーザやシステムユーザに対応するグループ
および
システム利用の用途別に定義されたグループ
0~999
一般グループ一般ユーザに対応するグループ
および
人の役割などに応じて定義されたグループ
1000~

ユーザは最低でも1つのグループに所属する。その中の1つがプライマリグループ(またはメイングループ)となり、ユーザがファイルやフォルダを作成したときのデフォルトの所有グループとなる。プライマリグループではない所属グループのことをセカンダリグループ(またはサブグループ、サプリメンタルグループ、補助グループなど)と呼ぶ。

通常、ユーザはユーザ名と同じ名前のグループがプライマリグループとなる。この同名のグループをユーザグループ(またはユーザプライベートグループ)と呼ぶ。一般に、ユーザグループにはそのユーザだけが所属する。これにより、ユーザが作成したファイルを編集できるのはデフォルトでは(管理者を除けば)そのユーザのみとなる。

シャドウパスワード

初期のUNIXでは誰でも見られるファイルにパスワードが保管されていたが、現在はrootだけが読み取り可能なファイルにパスワードが保管されるのが一般的である。これをシャドウパスワードとよぶ。Linuxではパスワードポリシーやエージングなどパスワード全般の管理を行うshadow-utilsパッケージによりシャドウパスワードが提供されている。

パスワードのエージング

エージングはここでは時間経過による変化することを意味しており、パスワードにおいては最大経過期間(時間経過によりパスワードが利用できなくなる日数)と、最小経過期間(パスワードを変更してから、また変更できるようになるまでの期間)の2つのことを指してエージングと呼ぶことが多い。

shadow-utilsではこれに関連して最大経過期間に達する前に警告を表示する設定、最大経過期間を超過した場合にアカウントを無効化する設定、特定の日付が到達したときにアカウントを無効化する設定にも対応している。

Name Service Switch

ユーザを管理する方法として、企業ではADなどのディレクトリサービスが利用されることが多いが、個人や小規模サービスではローカルアカウントが利用されることが多い。これらはどちらか一方を排他的に使う物ではなく、両方とも併用できるものである。そのような複数の場所に存在しうるデータを、どこを、どの順番で検索するか決定するものとしてNSSがある。

NSSとは

Name Service Switch、NSSはシステムが使用するデータベースを、カテゴリ別にどの順で検索するか決定するスキームである。以下にその設定ファイルnsswitch.confの例を示す。

passwd:         files systemd
group:          files systemd
shadow:         files systemd
gshadow:        files systemd

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis
Plain text

この設定ではhosts(ホスト名)であればfiles(要はhostsファイル)、DNSによる名前解決の順に検索するという指定になっている。この中でユーザ、グループに関係するのがpasswd(ユーザ情報データベース)、group(グループ情報データベース)、shadow(ユーザパスワードデータベース)、gshadow(グループパスワードやグループメンバーなどのデータベース)である。

NSSの背景

過去はこれらの設定はファイルによって管理されるのが普通であったが、NISやDNSのような名前解決により行われる方法が普及するにつれて、これらを複合的に使用できる仕組みが必要となった。そのために導入されたのがName Service Switchというスキームである。

ユーザ・グループに関するデータベース

passwd

passwdはユーザアカウントを管理するデータベースである。ファイルでは/etc/passwdが該当する。

user:x:1000:1000:,,,:/home/user:/bin/bashのように1ユーザあたり1行で、:区切りの書式で書かれる。項目の一覧を以下に示す。

項目例の値補足
ログイン名user
オプションの暗号化されたパスワードxx:shadowデータベースに格納されている
!で始まる:パスワードがロックされている
空欄:パスワード不要
ユーザID1000数値
グループID1000数値
ユーザ名またはコメント,,,
ユーザのホームディレクトリ/home/user
オプションのコマンドインタプリタ/bin/bash

shadow

shadowはシャドウパスワードに関する情報を含むデータベースである。ファイルでは/etc/shadowが該当する。

user:<暗号化パスワード>:20000:7:90:14:30::のように1ユーザあたり1行で、:区切りの書式で書かれる。項目の一覧を以下に示す。

項目値の例備考
ユーザ名user
暗号化されたパスワード<暗号化パスワード>ロックされている場合は!または*
最後にパスワードを変更した日20000UNIXエポックからの経過日数
パスワードを再変更できるまでの最短日数7
パスワード変更が必要となるまでの日数9090日ごとにパスワード変更を強制する
パスワードの有効期限が切れる前に警告を表示する日数14
パスワードの有効期限が切れてからアカウントが無効になるまでの日数30
アカウントが無効になる日(空欄)UNIXエポックからの経過日数
予約フィールド(空欄)

group

groupはグループを管理するデータベースである。ファイルでは/etc/groupが該当する。

group:x:1000:user1,user2のように1グループあたり1行で、:区切りの書式で書かれる。項目の一覧を以下に示す。

項目値の例備考
グループ名group
グループのパスワードxx:gshadowデータベースに格納されている
空欄:パスワード不要
グループID1000数値
グループに属するユーザのリストuser1,user2コンマ区切り

gshadow

gshadowはグループのシャドウパスワードを管理するデータベースである。ファイルでは/etc/gshadowが該当する。

test:!:1001:user2,user1 のように1行あたり1行で、:区切りの書式で書かれる。項目の一覧を以下に示す。

項目値の例備考
グループ名group
グループのパスワード!暗号化されたパスワード
!のように暗号化されたパスワードでない場合は、パスワードが設定されていないことを意味する。
パスワードが設定されていない場合、パスワードではこのグループの権限を得られない。
パスワードが設定されていれば、パスワードによりグループの権限を得ることができる。
グループの管理者1000コンマ区切りのユーザ名
管理者はグループのパスワードを変更する権限を持つ
グループに属するユーザのリストuser1,user2コンマ区切りのユーザ名
所属するユーザはパスワードを尋ねられることなくグループにアクセスできる。

データベースのエントリー

getent - Get Entries from NSS

getentはNSSにあるデータベースからエントリーを取得する。

getent データベース [キー]
Bash

passwdデータベースから、キーがrootの情報を取り出す例を示す。

getent passwd root
root:x:0:0:root:/root:/bin/bash
Bash

キーを指定しなかった場合、全てのエントリを表示する。

getent group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,user
(略)
Bash

shadow、gshadowのデータベースにアクセスするには管理者権限が必要である。

sudo getent shadow user
[sudo] password for yourname:
user:$y$j9(省略)0V03:20140:0:99999:7:::
Bash

ユーザ、グループの作成・管理

ユーザの管理

コマンドできること
useradd
adduser
ユーザの作成
userdel
deluser
ユーザの削除
usermodユーザ属性の変更
passwdパスワード、パスワードのエージング設定の変更

useradd / adduser - Add User

ユーザを追加する。

useradd [-r | --system] [option] USERNAME
adduser [--system] [option] USERNAME
Bash

オプションでpasswdやshadowに保存される設定の一部を指定できる。コマンドオプションで指定できない項目でデフォルトと異なる値を指定したい場合は、ユーザ作成後にpasswdコマンドで設定する。各コマンドで、項目を設定するオプションを示す。

データベース項目adduseruseradd / usermod
passwdログイン名引数で指定引数で指定
パスワード対話で指定-p PASSWORD
--password PASSWORD
※コマンドラインではプロセス名に
パスワードが表示されるため非推奨
ユーザID--uid UID-u UID
--uid UID
プライマリグループID--gid GID
--ingroup GROUP
-g GID
--gid GID
ユーザ名またはコメント--comment COMMENT-c COMMENT
--comment COMMENT
ホームディレクトリ--home HOME_DIR-d HOME_DIR
--home HOME_DIR
コマンドインタプリタ--shell-s
--shell
shadowユーザ名passwdデータベースと同じpasswdデータベースと同じ
パスワードpasswdデータベースと同じpasswdデータベースと同じ
最後にパスワードを変更した日--
パスワードを再変更できるまでの日数××
パスワード変更が必要となるまでの日数××
パスワード再変更の事前警告日数××
アカウントが無効になるまでの日数×-f DAYS
--inactive DAYS
アカウントが無効になる日×-e EXPIREDATE
--expiredate DATE
予約フィールド--
その他セカンダリグループ×-G GROUPLIST
--groups GROUPLIST

それ以外の動作に関するオプションを示す。

設定adduseruseradd
ホームディレクトリを作成する / しないする:デフォルト
しない:--no-create-home
する:-m--create-home
しない:-M--no-create-home
デフォルト動作はCREATE_HOME
ユーザグループを作成する / しないする:デフォルト
しない:×
する:-U--user-group
しない:-N--no-user-group
フォルト動作はUSERGROUPS_ENAB
パスワードを設定しない--disabled-passwordデフォルト
ログインしないユーザを作成する
(パスワードを指定しない+nologinにユーザを追加)
--disabled-login×
スケルトンディレクトリconfファイルで指定-k SKEL_DIR
--skel SKEL_DIR

スケルトンディレクトリ

スケルトンディレクトリとはホームディレクトリにデフォルトで配置するコンテンツが置かれているディレクトリのことである。スケルトンディレクトリの内容が作成されたホームディレクトリにコピーされる。

adduser

adduserは以下の特徴を持つユーザ追加スクリプトである。

  • useraddに比べてユーザフレンドリー
  • 対話式で入力するパスワード
  • confファイルで詳細な設定を指定可能
    • /etc/adduser.confにデフォルトのユーザ設定があり、デフォルト設定を変えることができる。また--confオプションで使用するconfファイルを指定でき、繰り返し同じ設定のユーザを作成する場合、confファイルを作って使い回すことができる。
  • adduserが無い環境あり

以下にadduserの実行例を示す。作成した内容やIDが表示されていることが分かる。

sudo adduser user3
[sudo] password for admin:
info: Adding user `user3' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `user3' (1004) ...
info: Adding new user `user3' (1004) with group `user3 (1004)' ...
info: Creating home directory `/home/user3' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for user3
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] y
info: Adding new user `user3' to supplemental / extra groups `users' ...
info: Adding user `user3' to group `users' ...
Bash
useradd

useraddは以下の特徴を持つユーザ追加コマンドである。

  • コマンドオプションで指定するパスワード
  • デフォルト値を変更可能

以下にuseraddの実行例を示す。基本的には何も表示されない。

sudo useradd user4
[sudo] password for admin:
getent passwd user4
user4:x:1005:1005::/home/user4:/bin/sh
Bash
ユーザ作成時のデフォルト設定

adduserとuseraddでコマンドオプションで指定しなかった項目はそれぞれのデフォルト値が使われる。useraddが使うデフォルト値が定義された/etc/default/useraddの内容の一部を示す。

# デフォルトのログインシェル
SHELL=/bin/sh

# 既存のグループの値
# ただしデフォルトの挙動ではユーザ名と同名のグループを作成し、それをプライマリグループとするため-gか-Nオプションが指定された場合に使用されうる。
# GROUP=100

# デフォルトのホームディレクトリ
# HOME=/home

# パスワードが失効してからアカウントが無効化されるまでの期間のデフォルト
# INACTIVE=-1

# ユーザが失効するまでの日のデフォルト
# EXPIRE=
Plain text

これらの値は環境により異なるが、adduserとuseraddの間でもデフォルト値が異なることがあるので注意する。

usermod - Modify User

ユーザのpasswdデータベース情報を更新する。またはユーザをロック・アンロックする。

usermod [option] USERNAME
Bash

usermodのオプションは基本的にはuseraddと同じであるため、useraddの項を参照すること。ただし、所属するグループを変更するときは、変更後の値を指定することに注意が必要である。たとえば、セカンダリグループがusersのユーザがセカンダリグループadmに追加で所属する場合はusermod -G users,adm USERNAMEとするか、差分追加を行う-aオプションと併用する。同様に差分削除する-rオプションもある。以下に例を示す。

groups
user1 users
sudo usermod -G adm user1
groups
user1 adm                 # NOTE:usersの所属から外れている
sudo usermod -G adm,users user1
groups
user1 adm users
sudo usermod -a -G user2 user1
groups
user1 adm users user2
sudo usermod -r -G adm user1
groups
user1 users user2
Bash

useraddにはないusermod独自のオプションとして、ユーザをロック・アンロックするオプションがある。

項目usermod
ユーザパスワードのロック
(パスワード認証、パスワード変更を禁止)
-L
--lock
ユーザパスワードのアンロック-U
--unlock

ユーザパスワードをロックするとshadowデータベースのパスワードの頭にロックを示す!が付与される。このロックはパスワードを使用できなくするものであり、アカウントがロックされているわけではない。アカウントをロックするにはEXPIREDATEを1にすると良い。実際に、パスワードをロックしたユーザに、パスワード不要なsuを行うことでユーザにログインする例を示す。

whoami
user
sudo getent shadow user3
user3:$y$j9T$(省略):20158:0:99999:7:::
sudo usermod --lock user3
sudo getent shadow user3
user3:!$y$j9T$(省略):20158:0:99999:7:::
sudo su user3
whoami
user3
exit
whoami
user
sudo usermod --expiredate 1 user3
sudo su user3
Your account has expired; please contact your system administrator.
su: Authentication failure
Bash

userdel / deluser - Delete User

ユーザを削除する。

userdel [option] USERNAME
deluser [option] USERNAME
Bash
userdel

userdelコマンドはユーザを削除する。同名のユーザグループがある場合、他にユーザが所属していなければグループも削除する。deluserが利用可能な場合、deluserの使用が推奨されている。

オプション意味
-r
--remove
ホームディレクトリとメールスプールを削除する。
-f
--force
たとえユーザがログイン中であったり、他のユーザが使用していたとしても
・ユーザアカウントを強制的に削除する。
・ホームディレクトリやメールスプールを強制的に削除する。
・同名のユーザグループを強制的に削除する。
deluser

deluserスクリプトはユーザを削除する。userdelコマンドとの大きな違いとしてバックアップ機能がある。

オプション意味
--remove-homeホームディレクトリとメールスプールを削除する。
--remove-all-filesユーザが所有者であるファイルを全て削除する。
--backupホームディレクトリとメールスプールのコンテンツを圧縮ファイルとしてバックアップを取る。
ファイル名はusername.tar.gz2などになる。
--backup-suffixバックアップの圧縮方式を指定する。
--backup-toバックアップの保存先を指定する。デフォルトはカレントディレクトリ。

passwd - Change User Password

passwdはユーザのパスワードまたはパスワードのエージングに関する設定を変更する。自身のパスワードを変更するときはユーザ名を省略できる。

passwd [option] USERNAME
Bash
データベース項目passwd
passwd全て×
shadowユーザ名×
パスワードオプションなしで実行
※パスワードなしにするときは-d,--delete
最後にパスワードを変更した日-
パスワードを再変更できるまでの日数-n DAYS
--mindays DAYS
パスワード変更が必要となるまでの日数-x DAYS
--maxdays DAYS
パスワード再変更の事前警告日数-w DAYS
--warndays DAYS
アカウントが無効になるまでの日数-i DAYS
--inactive DAYS
アカウントが無効になる日×
予約フィールド-

グループの管理

グループの管理もユーザとほぼ同じコマンドの考え方で行える。コマンド別の主要オプションを示す。

分類項目addgroupgroupaddgroupmodgpasswd
説明コマンドの用途グループの追加(高レベル)グループの追加(低レベル)グループの変更グループパスワードの変更
groupグループ名引数で指定
システムグループを作成するときは
--system を付ける。
引数で指定
システムグループを作成するときは
-r--systemを付ける。
引数で指定
変更する時は
-n NEWNAME
--newname NEWNAME
引数で指定
グループのパスワード×-p PASSWORD
--password PASSWORD
※非推奨
-p PASSWORD
--password PASSWORD
※非推奨
□パスワードの設定
引数無しで実行
□パスワードの削除
-r
--remove-password
□パスワードのロック
-R
--restrict
プライマリグループID--gid GID-g GID
--gid GID
-g GID
--gid GID
×
グループに属するユーザのリスト×-U USERLIST
--users USERLIST
-U USERLIST
--users USERLIST
□ユーザの追加
-a USER
--add USER
□ユーザの除外
-d USER
--delete USER
□ユーザリストの指定
-M USERLIST
--members USERLIST
gshadowグループ名----
グループのパスワード----
グループの管理者×××-A USERLIST
--administartors USERLIST
グループに属するユーザのリスト----

groupadd / addgroup - Add Group

グループを追加する。

groupadd [-r | --system] [option] GROUPNAME
addgroup [--system] [option] GROUPNAME
Bash

groupdel / delgroup - Delete Group

グループを削除する。いずれもプライマリグループにしているユーザがいるグループは削除しないため、あらかじめ利用者を除外する。

groupdel [option] GROUPNAME
delgroup [--system] [option] GROUPNAME
Bash
groupdelの独自オプション
オプション意味
-f
--force
削除しようとするグループにプライマリグループとして所属しているユーザがいても削除する。
delgroupの独自オプション
オプション意味
--system指定されたグループがシステムグループのときのみ削除する。指定されたグループがシステムグループでないとき、またはグループが存在しないときはdelgroupのステータスがエラーとはならない。
--only-if-emptyセカンダリグループを含めて、ユーザが所属していないグループのときのみ削除する。

groupmod - Modify Group

グループのgroupデータベース情報を更新する。

groupmod [option] GROUPNAME
Bash

gpasswd - Administrate Group

グループのパスワード、管理者、所属メンバなど、group・gshadowデータベース情報を更新する。またはグループをロック・アンロックする。

gpasswd [option] GROUPNAME
Bash

グループのロックは、ユーザのパスワードロックと同じく、パスワードを使用できなくするものである。つまり、newgrpを使ってパスワードによりグループの権限を取得することができなくなるが、グループに所属しているユーザには影響しない。

ファイルの直接編集

vipw / vigw - Edit passwd / group

passwd または groupファイルを直接編集する。-sオプションを付けるとシャドウファイルを直接編集する。

vipw [-s]
vigr [-s]
Bash

ユーザ・グループの切り替え

現在のユーザ、グループの確認

id - Print IDs

ユーザのUID、GID(プライマリおよびセカンダリ)を全て表示する。

id [option] USER
Bash

ユーザを指定しない場合、現在のユーザに関するIDが表示される。本稿では詳細は記載しないがUIDやGIDだけを表示するオプションもある。

id
uid=1000(user1) gid=1000(user1) groups=1000(user1),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users)
Bash

whoami - Print Username

現在有効なユーザの名前を表示する。id -unと同じ結果となる。

whoami
Bash

groups - Print Groups

現在有効な所属するグループを表示する。ユーザの指定がない場合、現在有効なユーザのグループが表示される。

groups [option] [USER1 ...]
Bash

ユーザを指定する場合と指定しない場合だと、ユーザ名が表示される/されないの違いがある。

whoami
user2
groups
user2 adm user1 support
groups user2
user2 : user2 adm user1 support
Bash

ユーザ・グループの切り替え

su - Switch User

ユーザを切り替える。権限が上のユーザに切り替える場合、一般に切り替え先ユーザのパスワードが要求される。切り替え先ユーザが指定されない場合、rootへの切り替えとなる。

su [オプション] [-] [切り替え先ユーザ [引数]]
Bash

後方互換性の維持のため、デフォルトではカレントディレクトリやHOME変数などが引き継がれる。通常、-または--loginを指定することで環境が混在しないようにし、副次的な影響が発生しないようにする。

オプション意味
-
-l
--login
新しいシェルにログインしたときのように初期化する。
-g GROUP
--group=GROUP
[root専用]
プライマリグループを指定する。
-G GROUPLIST
--supp-group=GROUPLIST
[root専用]
セカンダリグループを指定する。ただしプライマリグループが-gまたは--groupにより指定されない場合は、リストの最初のグループがプライマリグループとなる。
-c COMMAND
--command=COMMAND
指定のユーザとしてコマンドを実行する。

sg - Switch Group

グループを切り替え、指定のコマンドを実行する。コマンドは/bin/shで実行される。

sg [-] 切り替え先グループ 実行コマンド
Bash

指定したコマンドの実行が終了し、sgコマンドが完了すると、グループは元の状態となる。

groups
user1 users lsuser
sg lsuser 'groups'
lsuser users user1
groups
user1 users lsuser
Bash

newgrp - New Group

プライマリグループを切り替えた新しいセッション(サブシェル)を開始する。グループが指定されなかったときはpasswdデータベースにあるプライマリグループに切り替える。sgと似ているが、コマンドは指定できない。

groups [-] [GROUP]
Bash

以下にプライマリグループをuser3、デフォルトの順で切り替える例を示す。所属していないユーザが、パスワードが設定されたグループに切り替える場合、通常はパスワードが求められる。

id
uid=1009(user2) gid=1003(user2) groups=1003(user2),4(adm),1002(user1),1009(support)
newgrp user3
Password:
id
uid=1009(user2) gid=1010(user3) groups=1010(user3),4(adm),1002(user1),1003(user2),1009(support)
newgrp
id
uid=1009(user2) gid=1003(user2) groups=1003(user2),4(adm),1002(user1),1009(support),1010(user3)
exit
exit
id
uid=1009(user2) gid=1010(user3) groups=1010(user3),4(adm),1002(user1),1003(user2),1009(support)
exit
exit
id
uid=1009(user2) gid=1003(user2) groups=1003(user2),4(adm),1002(user1),1009(support)
Bash

グループにパスワードが設定されていないときはパスワードは問われない。

id
uid=1009(user2) gid=1003(user2) groups=1003(user2),4(adm),1002(user1),1009(support)
newgrp adm     # admは所属しているグループ
id
uid=1009(user2) gid=4(adm) groups=4(adm),1002(user1),1003(user2),1009(support)
Bash

パスワード認証が要求される状況では、パスワードがロックされているグループには切り替えられない。

user@pc:~$ sudo getent gshadow user3
user3:!::      # user3グループはパスワードがロック(!)されている
user@pc:~$ newgrp user3
Password:      # パスワードが必要だがロックされているので切り替えられない
Invalid password.
user@pc:~$ sudo newgrp user3
root@pc:/home/user1$ id
uid=0(root) gid=1010(user3) groups=1010(user3),0(root)  # rootならパスワード無しでuser3に入れる
Bash

なお、suコマンドと同じように-を指定すると環境変数やカレントディレクトリを引き継がず、新しいログインセッションのように環境を再初期化する。

一時的な権限の使用

sudo - SuperUser Do

コマンドをセキュリティポリシーにより決まる必要な権限で実行する。デフォルトのセキュリティポリシーとしてsudoersが使われる。sudoersの内容および設定方法は次のvisudoの項目で触れる。

sudo [オプション] [ユーザの指定] [グループの指定] [ホストの指定] [ディレクトリの指定] [シェルの指定] [実行するコマンド]
Bash
対象オプション意味
コマンドを実行するユーザ-u USER
--user=USER
コマンドを実行するユーザを指定する。
コマンドを実行するグループ-g GROUP
--group=GROUP
コマンドを実行するグループを指定する。
コマンドを実行するホスト-h HOST
--host=HOST
コマンドを実行するホストを指定する。
コマンドを実行するディレクトリ-D DIRECTORY
--chdir=DIRECTORY
コマンドをカレントディレクトリではなく、指定のディレクトリで実行する
-R DIRECTORY
--chroot=DIRECTORY
コマンドをCHROOTしてから実行する。
コマンドを実行するシェル-i
--login
コマンドを実行するユーザのデフォルトシェルを使う
-s
--shell
SHELL環境変数または現在のユーザのデフォルトシェルを使う

-l(--list)オプションを使うと、セキュリティポリシーの内容を確認できる。デフォルトでは自分の現在のホストにおけるポリシーが表示されるが-U(ポリシーを確認するユーザ)などで確認するポリシーを指定できる。

sudo -l
Matching Defaults entries for user1 on mypc:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    use_pty

User user1 may run the following commands on mypc:
    (ALL : ALL) NOPASSWD: /usr/bin/ls
Bash

必要であればsudoは認証を要求し、許可されていれば認証結果をキャッシュする。認証キャッシュは更新または失効できる。

オプション意味
-v
--validate
ユーザの認証キャッシュを更新する。(必要なら認証が要求される)
-k
--reset-timestamp
コマンドが指定された場合:そのコマンドを認証キャッシュを使わないでsudoする。このとき認証キャッシュは更新されない。
コマンドが指定されない場合:現在のセッションにおける認証キャッシュを無効化する。
-K
--remove-timestamp
現在のユーザにおける認証キャッシュを無効化する。

visudo - Vi Sudoers

visudoは安全にsudoersファイルを編集する。visudoは、sudoersファイルの同時編集の防止、構文エラーや正当性の検証機能を提供する。visudoが使用するエディタはsudoersの設定により異なるが、環境変数SUDO_EDITOR、VISUAL、EDITORや/usr/bin/editorなどが使われる。

visudo [オプション] [-] [-f sudoersファイル]
Bash

間違った編集をするとメッセージを表示し、修正を促す。

/etc/sudoers:59:35: expected a fully-qualified path name
%lsuser ALL = (ALL:ALL) NOPASSWD: ls
                                  ^~
What now?
Options are:
  (e)dit sudoers file again
  e(x)it without saving changes to sudoers file
  (Q)uit and save changes to sudoers file (DANGER!)
Bash
sudoers

sudoersファイルの基本構文を以下に示す。

user host = [(runAs)] [option ...] [tag: ...] command[, ...]
Bash

sudoersには誰が、どのホストで、どのユーザになって、どういう条件で、何ができるかを書く

項目内容説明
user誰が権限を与えるユーザまたはグループ名
以下のいずれかの記法を使う。
USERNAME
%GROUPNAME
#USERID
%#GROUPID
hostどのホストで権限を与えるホスト名
1つのsudoersファイルを複数のホストで使い回すときに、ホストごとに権限を使い分ける時に使う。そうでなければALLで良い。
以下のいずれかの記法を使う。
ALL全てのホスト
sample.example.comホスト名のFQDN
192.0.2.0/24ネットワークアドレス
192.0.2.1ホストアドレス
runAsどのユーザになりコマンドを実行するユーザまたは/およびグループ名
以下のいずれかの記法を使う。全てのユーザ/グループで実行できるALLが指定でき、単に特権を与えるならALL(またはALL:ALL)で良い。
(USERNAME)
(:GROUPNAME)
(USERNAME:GROUPNAME)
なお、(USER1, :GROUP1, USER2:GROUP2 )のように複数書くこともできる。
optionどのようなオプション設定で以下のいずれかの設定
・SELinuxのロールなどに関する指定
・権限を与える期間に関する指定
・タイムアウトに関する指定
・実行するディレクトリに関する指定
・実行するルートディレクトリに関する指定
tag:どういう条件のもとでPASSWD:/NOPASSWD:コマンド実行前にユーザ認証を要求する(デフォルト) / しない
EXEC:/NOEXEC:シェルエスケープ(外部コマンドの実行)を有効にする / しない(デフォルト)
LOG_INPUT:/NOLOG_INPUT:ユーザ入力を記録する / しない(デフォルト)
LOG_OUTPUT:/NOLOG_OUTPUT:画面出力を記録する / しない(デフォルト)
他にもメール通知等のタグがある。
command何ができるか実行権限を与えるコマンド
コマンドはフルパスで指定するが、ワイルドカードは使用できる。
^EXPRESSION$の書式で正規表現も使用できる。(^と$が必須)
複数のコマンドをカンマ区切りで指定できる。
ディレクトリを指定した場合、そのディレクトリにあるコマンド全ての権限を与える。
sudoersの設定例

ためしに、lsコマンドを自由に実行できるlsuserグループを作成してみる。まずはsudoersに以下の内容を追記する。

%lsuser ALL = (ALL:ALL) NOPASSWD: /usr/bin/ls
Bash

次にuser1をlsuserグループに所属させる。

sudo addgroup lsuser
info: Selecting GID from range 1000 to 59999 ...
info: Adding group `lsuser' (GID 1011) ...
sudo gpasswd -a user1 lsuser
Adding user user1 to group lsuser
Bash

最後に、user1がそのままでは見られないところをsudo lsで見てみると、パスワード無しで見ることができる。

whoami
user1
id
uid=1001(user1) gid=1002(user1) groups=1002(user1),100(users),1011(lsuser)
ls /home/user3
ls: cannot open directory '/home/user3': Permission denied
sudo ls /home/user3
user3file
Bash

lsuserに所属していないuser2で同じことをするとsudoでエラーになる。

whoami
user2
id
uid=1009(user2) gid=1003(user2) groups=1003(user2),100(users)
ls /home/user3
ls: cannot open directory '/home/user3': Permission denied
sudo ls /home/user3
[sudo] password for user2:
user2 is not in the sudoers file.
Bash

優先順位

重複するポリシーがあった場合、一番最後に記載されたポリシーが有効となる。

sudo -l
Matching Defaults entries for user1 on mypc:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    use_pty

User user1 may run the following commands on mypc:
    (ALL : ALL) NOPASSWD: /usr/bin/ls
    (ALL : ALL) PASSWD: /usr/bin/ls
    (ALL : ALL) PASSWD: /usr/bin/su
sudo ls /home/user3
[sudo] password for user1: # パスワードが要求される
user3file
Bash

アクセス制御リスト

ファイルとディレクトリは、ファイルの所有者、所有グループ、それ以外の3つに分けた権限セットが設定される。逆に言えば、この権限セットではユーザごとに異なる権限を設定できない。これの実現にはアクセス制御リスト(ACL)を使う。

ACLのサポート対象

ACLをサポートするファイルシステムはカーネルにより異なる。Ubuntu 24ではext2/3/4やxfsがサポートされる。また、ファイルシステムをマウントするときにACLオプションを有効にする必要がある。Ubuntu 24ではデフォルトで有効になっていた。

ACLエントリ

ACLはACLエントリのリストである。

タグタイプ

ACLエントリには6種類のタグタイプがある。

タグタイプ意味
ACL_USER_OBJファイル所有者のアクセス権を示す。
ACL_USER修飾子で指定されたユーザのアクセス権を示す。
ACL_GROUP_OBJファイル所有グループのアクセス権を示す。
ACL_GROUP修飾子で指定されたグループのアクセス権を示す。
ACL_MASKファイル所有者ではないユーザ、グループ(ACL_USER、ACL_GROUP_OBJ、ACL_GROUP)に対して、与えることができる最大のアクセス権を示す。
例えば、ファイル所有者以外には書き込み権限を与えないようにするにはr-xのようなマスクを指定する。
ACL_OTHER上記以外のACLエントリ

ACLの評価は以下の順で行われる。

  1. 現在有効なユーザIDがファイル所有者である場合
    • ACL_USER_OBJで許可されている操作なら許可、されていなければ拒否
  2. 現在有効なユーザIDがACL_USERと一致する場合
    • ACL_USERとACL_MASKを組み合わせた結果が許可されている操作なら許可、されていなければ拒否
  3. 現在有効なグループ(プライマリとセカンダリ)がACL_GROUP_OBJまたはACL_GROUPと一致する場合
    • ACL_GROUP_OBJ、ACL_GROUP、ACL_MASKを組み合わせた結果が許可されている操作なら許可、されていなければ拒否
  4. ACL_OTHERで許可されている操作なら許可
  5. 拒否

テキストフォーマットのエントリ

ACLエントリは以下のテキストフォーマットで表される。

種類:識別子:権限
Bash
項目内容
タグタイプACLのタグタイプuser:ACL_USER_OBJまたはACL_USER
group:ACL_GROUP_OBJまたはACL_GROUP
other:ACL_OTHER
mask:ACL_MASK
タグ修飾子ACL_USERまたはACL_GROUPにおいて、ACLを適用するユーザまたはグループユーザ名やグループ名
権限許可される権限r:読み取り
w:書き込み
x:実行

ロング形式とショート形式

ここで示したuser:username:rwxはロング形式のテキストフォーマットであり、1行1エントリで表される。ショート形式ではu:username:rwxのようになり、,区切りで1行に複数エントリを書ける。

ACLの取得・設定

ACLの設定はsetfacl、取得はgetfaclで行える。

getfacl - Get File ACL

getfaclはファイルのACLを表示する。特にACLを設定しない状態ではファイルのアクセス権がACL形式で表示されるのみである。

getfacl [オプション] ファイル
Bash

chmodによりACLの内容が変化する例を示す。

getfacl testfile
# file: testfile
# owner: user2
# group: user2
user::rw-
group::rw-
other::r--

chmod 644 testfile
getfacl testfile
# file: testfile
# owner: user2
# group: user2
user::rw-
group::r--
other::r--
Bash
Bash

setfacl - Set File ACL

setfaclでファイルのACLを設定する。-mまたは-Mで追加・編集、-xまたは-Xで削除する。

setfacl {-m|-x} ACL 対象のファイル
setfacl {-M|-X} ACLが書かれたファイル 対象のファイル
Bash

user3に対しtestfileへ書き込み権限を与えるコマンドを実行する。

getfacl testfile
# file: testfile
# owner: user2
# group: user2
user::rw-
group::r--
mask::rw-
other::r--
setfacl -m user:user3:rw testfile
getfacl testfile
# file: testfile
# owner: user2
# group: user2
user::rw-
user:user3:rw-
group::r--
mask::rw-
other::r--
Bash

user3で権限の変化を確認してみる。

echo 'before' > testfile
bash: testfile: Permission denied
# ここで権限付与が行われた
echo 'after' > testfile
cat testfile
after
Bash

権限を削除するとき、パーミッションは指定しない。

setfscl -x user:user3:rw testfile
setfacl: Option -x: Invalid argument near character 12
setfacl -x user:user3: testfile
getfacl testfile
# file: testfile
# owner: user2
# group: user2
user::rw-
group::r--
mask::r--
other::r--
Bash

マスク値の変化

この例をよく見ると、権限の削除後にmaskの値が変わっていることが分かる。これはsetfaclがマスクの値を必要十分な値に再計算するためである。再計算したくないときは、-n(--no-mask)を使う。

パーミッションの表示

ACLを設定すると、lsなど一部コマンドの出力が変化する。

 ll
total 12
drwxrwxr-x  2 root  users 4096 Mar 15 13:18 ./
drwxr-xr-x  6 root  root  4096 Mar 15 13:08 ../
-rw-rw-r--+ 1 user2 user2    5 Mar 15 13:18 testfile
Bash

パーミッションの末尾にあるプラス記号は、このファイルにACLが設定されていることを示している。このプラス記号が表示されている場合、実際の権限と表示上の権限が一致しないことがある。上の表示ではtestfileのuser2グループは読み込み・書き込みができる権限を持っているように見えるが、実際はそうではない。

getfacl testfile
# file: testfile
# owner: user2
# group: user2
user::rw-
user:user3:rw-
group::r--
mask::rw-
other::r--
Bash

getfaclの結果を見ると、user2グループは読み込み権限しかない。lsコマンドの結果はmask::rw-により、最大で読み込み、書き込み権限を持つグループがあるという程度の意味になっている。要は、プラス記号が付いているファイルの権限はACLで確認しなさいということである。

デフォルトACL

デフォルトACLを設定されたディレクトリでファイル・フォルダを作成すると、自動でそのACLが適用される。デフォルトACLはACLエントリの頭にdefault:を付けたものになる。

default:ACLエントリ
Bash

デフォルトACLを設定するときはsetfaclでこのフォーマットでACLを指定するか、--defaultオプションを使っても良い。

mkdir defdir
setfacl --default -m u::rwx,g::rwx,o::- defdir
setfacl -m d:g:user3:- defdir
getfacl defdir
# file: defdir
# owner: user3
# group: user3
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:group:user3:---
default:mask::rwx
default:other::---


Bash

このディレクトリでファイルを作成すると、最初からACLが適用されている。

ls -l
total 0
touch sample.txt
ls -l
total 0
-rw-rw----+ 1 user3 user3 0 Mar 15 14:10 sample.txt
getfacl sample.txt
# file: sample.txt
# owner: user3
# group: user3
user::rw-
group::rwx                      #effective:rw-
group:user3:---
mask::rw-
other::---
Bash

ファイルモード作成マスク

この例を見ると新しいファイルのACLではxが設定されていないことが分かる。デフォルトACLは作成されるファイルに与えてもよい最大の権限を指定するものとなり、実際に与えられる権限はファイルを作成するコマンド(の実装)に依存する。今回の例であれば、touchコマンドがrw-rw-r--でファイルを作成しようとするとき、デフォルトACLを使ってそれより強い権限を与えることはできない。これを行うにはファイル作成後にACLをあらためて指定する。

逆に、通常与えられる権限より弱い権限に制限することは期待通りに動作する。この動作はACLが指定されていないときにumaskが行うものである。

mkdir defdir
setfacl --default -m u::rwx,g::-,o::- defdir
getfacl defdir
# file: defdir
# owner: user3
# group: user3
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::---
default:other::---

touch defdir/sample
getfacl defdir/sample
# file: defdir/sample
# owner: user3
# group: user3
user::rw-
group::---
other::---
Bash

仮に、ディレクトリを作成するコマンドmkdirがrwxrwxr-xで作成しようとするときであれば、xも付いたACLが与えられることになる。

mkdir subdir
getfacl subdir
# file: subdir
# owner: user3
# group: user3
user::rwx
group::rwx
other::---
default:user::rwx
default:group::rwx
default:other::---
Bash

デフォルトACLの引き継ぎ

ディレクトリを作成すると、そのディレクトリにデフォルトACLも引き継がれる。

getfacl .
# file: .
# owner: user3
# group: user3
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::---
default:other::---

mkdir subdir
getfacl subdir
# file: subdir
# owner: user3
# group: user3
user::rwx
group::---
other::---
default:user::rwx
default:group::---
default:other::---
Bash

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です