ユーザ・グループ管理系のコマンド
はじめに
ユーザ
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 | |
オプションの暗号化されたパスワード | x | x:shadowデータベースに格納されている !で始まる:パスワードがロックされている 空欄:パスワード不要 |
ユーザID | 1000 | 数値 |
グループID | 1000 | 数値 |
ユーザ名またはコメント | ,,, | |
ユーザのホームディレクトリ | /home/user | |
オプションのコマンドインタプリタ | /bin/bash |
shadow
shadowはシャドウパスワードに関する情報を含むデータベースである。ファイルでは/etc/shadowが該当する。
user:<暗号化パスワード>:20000:7:90:14:30::
のように1ユーザあたり1行で、:区切りの書式で書かれる。項目の一覧を以下に示す。
項目 | 値の例 | 備考 |
---|---|---|
ユーザ名 | user | |
暗号化されたパスワード | <暗号化パスワード> | ロックされている場合は!または* |
最後にパスワードを変更した日 | 20000 | UNIXエポックからの経過日数 |
パスワードを再変更できるまでの最短日数 | 7 | |
パスワード変更が必要となるまでの日数 | 90 | 90日ごとにパスワード変更を強制する |
パスワードの有効期限が切れる前に警告を表示する日数 | 14 | |
パスワードの有効期限が切れてからアカウントが無効になるまでの日数 | 30 | |
アカウントが無効になる日 | (空欄) | UNIXエポックからの経過日数 |
予約フィールド | (空欄) |
group
groupはグループを管理するデータベースである。ファイルでは/etc/groupが該当する。
group:x:1000:user1,user2
のように1グループあたり1行で、:区切りの書式で書かれる。項目の一覧を以下に示す。
項目 | 値の例 | 備考 |
---|---|---|
グループ名 | group | |
グループのパスワード | x | x:gshadowデータベースに格納されている 空欄:パスワード不要 |
グループID | 1000 | 数値 |
グループに属するユーザのリスト | 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コマンドで設定する。各コマンドで、項目を設定するオプションを示す。
データベース | 項目 | adduser | useradd / 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 |
それ以外の動作に関するオプションを示す。
設定 | adduser | useradd |
---|---|---|
ホームディレクトリを作成する / しない | する:デフォルト しない: --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 | |
アカウントが無効になる日 | × | |
予約フィールド | - |
グループの管理
グループの管理もユーザとほぼ同じコマンドの考え方で行える。コマンド別の主要オプションを示す。
分類 | 項目 | addgroup | groupadd | groupmod | gpasswd |
---|---|---|---|---|---|
説明 | コマンドの用途 | グループの追加(高レベル) | グループの追加(低レベル) | グループの変更 | グループパスワードの変更 |
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 ホスト名のFQDN192.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