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

はじめに

ユーザ

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

この設定では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 データベース [キー]

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

getent passwd root
(out)root:x:0:0:root:/root:/bin/bash

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

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

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

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

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

ユーザの管理

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

useradd / adduser - Add User

ユーザを追加する。

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

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

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

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

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

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

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

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

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

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

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

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

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

usermod - Modify User

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

usermod [option] USERNAME

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

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

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

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

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

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

userdel / deluser - Delete User

ユーザを削除する。

userdel [option] USERNAME
deluser [option] USERNAME
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
データベース項目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
□ユーザの追加
-a -U USERLIST
-a --users USERLIST
□ユーザの除外
-r -U USERLIST
-r --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

groupdel / delgroup - Delete Group

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

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

groupmod - Modify Group

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

groupmod [option] GROUPNAME

gpasswd - Administrate Group

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

gpasswd [option] GROUPNAME

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

ファイルの直接編集

vipw / vigw - Edit passwd / group

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

vipw [-s]
vigr [-s]

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

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

id - Print IDs

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

id [option] USER

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

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

whoami - Print Username

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

whoami

groups - Print Groups

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

groups [option] [USER1 ...]

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

whoami
(out)user2
groups
(out)user2 adm user1 support
groups user2
(out)user2 : user2 adm user1 support

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

su - Switch User

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

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

後方互換性の維持のため、デフォルトではカレントディレクトリや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 [-] 切り替え先グループ 実行コマンド

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

groups
(out)user1 users lsuser
sg lsuser 'groups'
(out)lsuser users user1
groups
(out)user1 users lsuser

newgrp - New Group

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

groups [-] [GROUP]

以下にプライマリグループを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)

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

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

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

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に入れる

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

一時的な権限の使用

sudo - SuperUser Do

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

sudo [オプション] [ユーザの指定] [グループの指定] [ホストの指定] [ディレクトリの指定] [シェルの指定] [実行するコマンド]
対象オプション意味
コマンドを実行するユーザ-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
(out)Matching Defaults entries for user1 on mypc:
(out)    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
(out)    use_pty
(out)
(out)User user1 may run the following commands on mypc:
(out)    (ALL : ALL) NOPASSWD: /usr/bin/ls

必要であれば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ファイル]

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

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

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

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

    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
    

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

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

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

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

    優先順位

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

    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
    

    コメントを残す

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