はじめに
AIXにおいて、システム情報の収集を行う snap コマンドは通常、特権ユーザー(root)のみが実行可能です。一般ユーザーが実行しようとすると、以下のようにパーミッションエラーとなります。
$ whoami
testuser
$ snap
ksh: snap: 0403-006 Execute permission denied.
$
本記事では、AIXの Enhanced Role Based Access Control (RBAC) 機能を活用し、特定の一般ユーザーにカスタムロールを割り当てることで、snap コマンドを実行可能にする手順を確認しました。
動画
当記事のご参考動画です。音声動画で理解の一助にお役立てください。
環境
Operating System: AIX 7.3.1.1
# oslevel -s
7300-01-01-2246
#
準備:検証用一般ユーザーの作成
一般ユーザー bob を作成します。
# lsuser bob
3004-687 User "bob" does not exist.
プライマリ・グループに staff を割り当て
# mkuser pgrp=staff home=/home/bob shell=/usr/bin/ksh bob
作成直後の bob ユーザーの属性を確認すると、roles 項目は空の状態です。
# lsuser -a roles default_roles bob
bob roles= default_roles=
パスワードを設定
# passwd bob
Changing password for "bob"
bob's New password:
Enter the new password again:
#
現状確認:一般ユーザーができること・できないこと
一般ユーザーでも特権コマンドでない一般的なコマンドは実行が可能です。
- errpt -> OK
$ errpt | head -n 3
IDENTIFIER TIMESTAMP T C RESOURCE_NAME DESCRIPTION
E87EF1BE 0316150020 P O dumpcheck The largest dump device is too small.
E87EF1BE 0315150020 P O dumpcheck The largest dump device is too small.
$ errpt -aj E87EF1BE | head -n 10
---------------------------------------------------------------------------
LABEL: DMPCHK_TOOSMALL
IDENTIFIER: E87EF1BE
Date/Time: Mon Mar 16 15:00:16 CDT 2020
Sequence Number: 1854
Machine Id: 00C5CA214B00
Node Id: aix73testu
Class: O
Type: PEND
$
- ls コマンド : 読み取り権限があるものはOK
$ ls -l /var
total 24
drwxrwx--- 2 root adm 256 May 11 2023 aacct
drwxrwxr-x 15 root adm 4096 Oct 07 00:59 adm
drwxr-xr-x 3 root system 256 Nov 21 2021 cache
drwxr-xr-x 2 root system 256 Nov 21 2021 cache_mgt
drwxrwxr-x 6 bin bin 4096 Sep 22 03:51 ct
- cat コマンド : 読み取り権限があるものはOK
$ cat /etc/inittab | head -n 3
: @(#)49 1.28.5.6 src/bos/etc/inittab/inittab, cmdoper, bos730, initial_extract 8/11/14 00:17:16
: IBM_PROLOG_BEGIN_TAG
: This is an automatically generated prolog.
$
- lparstat : OK
$ lparstat
System configuration: type=Shared mode=Uncapped smt=8 lcpu=8 mem=2048MB psize=8 ent=0.10
%user %sys %wait %idle physc %entc lbusy app vcsw phint %nsp %utcyc
----- ----- ------ ------ ----- ----- ------ --- ----- ----- ----- ------
0.0 0.1 0.0 99.9 0.00 1.4 0.0 6.19 3263617547 10410 129 22.53
- vmstat : OK
$ vmstat
System configuration: lcpu=8 mem=2048MB ent=0.10
kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------------------
r b avm fre re pi po fr sr cy in sy cs us sy id wa pc ec
2 1 392368 3892 0 0 0 0 1 0 7 35 194 0 0 99 0 0.00 1.4
$
- sftp : 実行エラーにならなかったのでOK
$ sftp
usage: sftp [-46aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher]
[-D sftp_server_path] [-F ssh_config] [-i identity_file]
[-J destination] [-l limit] [-o ssh_option] [-P port]
[-R num_requests] [-S program] [-s subsystem | sftp_server]
destination
$
- ps : OK
root のプロセスも見えています。
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Oct 07 - 0:04 /etc/init
root 2949486 1 0 Oct 07 - 0:00 /usr/ccs/bin/shlap64
root 3211538 1 0 Oct 07 - 8:53 /usr/sbin/syncd 60
root 3408128 6554074 0 Oct 07 - 0:00 /usr/sbin/biod 6
root 3539352 1 0 Oct 07 - 0:00 /usr/lib/errdemon
root 4588000 6554074 0 Oct 07 - 0:14 /usr/sbin/snmpmibd
root 4653486 1 0 Oct 07 - 0:20 /usr/sbin/cron
root 5112216 6554074 0 Oct 07 - 0:00 /usr/sbin/nfsd 3891
(省略)
- lsattr : OK
$ lsattr -El sys0
SW_dist_intr false Enable SW distribution of interrupts True
autorestart true Automatically REBOOT OS after a crash True
boottype disk N/A False
~ 省略 ~
- snap : NG パーミッション・エラー
$ snap
ksh: snap: 0403-006 Execute permission denied.
$
- chuser : NG パーミッション・エラー
$ chuser bob
ksh: chuser: 0403-006 Execute permission denied.
$
- まとめ
| コマンドカテゴリ | コマンド例 | 実行可否 | 備考 |
|---|---|---|---|
| システム統計・情報 | lparstat, vmstat, iostat | OK | システムの稼働状況やパフォーマンス統計の参照は可能。 |
| プロセス管理 | ps -ef | OK | root ユーザーを含むシステム全体のプロセス一覧を参照可能。 |
| エラーログ参照 | errpt | OK | システムエラーログのサマリーや詳細の表示が可能。 |
| ファイル操作 | ls, cat | OK | パーミッション(読み取り権限)があるディレクトリやファイルは操作可能。 |
| デバイス属性 | lsattr | OK | システムデバイス(sys0等)の設定値の表示が可能。 |
| ネットワーク/接続 | sftp | OK | バイナリの実行およびヘルプ画面の表示が可能。 |
| システム診断収集 | snap | NG | 特権ユーザーのみ実行可能。一般ユーザーは Execute permission denied。 |
| ユーザー管理 | chuser | NG | 特権ユーザーのみ実行可能。一般ユーザーは Execute permission denied。 |
特権設定の調査(root ユーザーで実施)
snap コマンドを一般ユーザーで動かすために、まずはコマンドに必要な権限(Authorization)を調査します
以下は root ユーザーで確認・実行しています。
# whoami
root
#
- snap コマンドに割り当たっている権限を確認します。
# lssecattr -c -a accessauths /usr/sbin/snap
/usr/sbin/snap accessauths=aix.system.stat,aix.ras.snap
特権ファイル・データベース内の項目は、 lssecattr コマンドを使用してリストすることができ、 setsecattr コマンドを使用して作成または変更することができます。
- privcmds ファイル 内の snap コマンドを確認します。
# grep -p "/usr/sbin/snap" /etc/security/privcmds
/usr/sbin/snap:
accessauths = aix.system.stat,aix.ras.snap
innateprivs = PV_AZ_ROOT,PV_DAC_O,PV_DAC_R,PV_DAC_W,PV_DAC_X,PV_KER_ACCT,PV_KER_RAC,PV_PROC_PRIV,PV_PROC_RAC
inheritprivs = PV_AU_PROC,PV_AZ_READ,PV_AZ_ROOT,PV_DAC_,PV_DAC_GID,PV_DAC_O,PV_DAC_R,PV_DAC_W,PV_DAC_X,PV_DEV_CONFIG,PV_DEV_QUERY,PV_FS_CHOWN,PV_FS_MKNOD,PV_KER_ACCT,PV_KER_EXTCONF,PV_KER_LVM,PV_KER_RAC,PV_KER_RAS,PV_KER_VARS,PV_NET_CNTL,PV_NET_PORT,PV_NET_RAWSOCK,PV_PROC_PRIV,PV_PROC_RAC,PV_PROC_TIMER,PV_PROC_VARS
egid = 0
secflags = FSF_EPS
#
snap の実行には、以下の2つの権限が必要であることがわかります。
aix.system.stataix.ras.snap
AIXのRBACでは、ユーザーに「コマンドを実行する権利(Authorization)」を与えます。一方で、コマンド自体には「実行時にOSの制限を回避する力(Privilege)」が定義されています。 ユーザーが正しい権限(Role)を持ってコマンドを叩くと、コマンド側が持つ特権が有効になり、rootでなくてもシステム内部の情報にアクセスできるようになる仕組みです。
カスタムロールの作成と割り当て
必要な権限が判明したため、これらをまとめたカスタムロール SnapRole を作成し、ユーザーに付与します。
1: ロールの作成
# mkrole authorizations=aix.system.stat,aix.ras.snap SnapRole
# lsrole SnapRole
SnapRole authorizations=aix.system.stat,aix.ras.snap rolelist= groups= visibility=1 screens=* dfltmsg= msgcat= auth_mode=INVOKER id=20
#
なお、aix.system.statとaix.ras.snap で許可されているコマンドも実行が可能になります。
aix.system.statとaix.ras.snap に紐づくコマンドを /etc/security/privcmds で確認
確認結果 (おりたたみ)
- aix.system.stat
# grep -p "aix.system.stat" /etc/security/privcmds
/usr/bin/lslicense:
accessauths = aix.system.stat,aix.system.config
innateprivs = PV_DAC_R,PV_DAC_X,PV_KER_IPC_R
secflags = FSF_EPS
/usr/esa/sbin/accesskey_rtas:
accessauths = aix.system.stat
innateprivs = PV_DAC_W,PV_DAC_O,PV_DEV_CONFIG
secflags = FSF_EPS
/usr/esa/sbin/creatediag:
accessauths = aix.system.stat
innateprivs = PV_DAC_O,PV_PROC_PRIV,PV_TCB,PV_KER_ACCT,PV_KER_RAC
secflags = FSF_EPS
/usr/esa/sbin/esa_auth:
accessauths = aix.system.stat
innateprivs = PV_DAC_R,PV_DAC_X,PV_KER_RAC,PV_NET_CNTL,PV_NET_PORT,PV_AU_ADD,PV_DAC_W
secflags = FSF_EPS
/usr/esa/sbin/esa_checkrole:
accessauths = aix.system.stat
innateprivs = PV_PROC_PRIV,PV_KER_ACCT
secflags = FSF_EPS
/usr/esa/sbin/hmcControlled:
accessauths = aix.system.stat
innateprivs = PV_DAC_W,PV_DAC_O,PV_KER_RAC,PV_DEV_CONFIG
secflags = FSF_EPS
/usr/sbin/strinfo:
accessauths = aix.system.stat
innateprivs = PV_DAC_R
secflags = FSF_EPS
/usr/sbin/machstat:
accessauths = aix.system.stat
innateprivs = PV_DAC_R,PV_DAC_X,PV_DEV_CONFIG
secflags = FSF_EPS
/usr/sbin/lsvpd:
accessauths = aix.system.stat
innateprivs = PV_AZ_ROOT,PV_DAC_R,PV_DAC_X,PV_DEV_CONFIG
secflags = FSF_EPS
/usr/lib/boot/bin/machstat_chrp:
accessauths = aix.system.stat
innateprivs = PV_DAC_R,PV_DEV_CONFIG
secflags = FSF_EPS
/usr/sbin/pstat:
accessauths = aix.system.stat
innateprivs = PV_DAC_R,PV_DAC_X
secflags = FSF_EPS
/usr/bin/genld:
accessauths = aix.system.stat
innateprivs = PV_DAC_R
secflags = FSF_EPS
/usr/bin/gennames:
accessauths = aix.system.stat
innateprivs = PV_DAC_R,PV_SU_UID
secflags = FSF_EPS
/usr/bin/gensyms:
accessauths = aix.system.stat
innateprivs = PV_DAC_R
secflags = FSF_EPS
/usr/lib/sa/sa1:
accessauths = aix.system.stat
innateprivs = PV_DAC_R
secflags = FSF_EPS
/usr/lib/sa/sa2:
accessauths = aix.system.stat
innateprivs = PV_DAC_R,PV_DAC_W
secflags = FSF_EPS
/usr/lib/sa/sadc:
accessauths = aix.system.stat
innateprivs = PV_DAC_O,PV_DAC_R,PV_DAC_W,PV_KER_VARS
secflags = FSF_EPS
/usr/sbin/sa:
accessauths = aix.system.stat
innateprivs = PV_DAC_W
euid = 0
egid = 0
secflags = FSF_EPS
/usr/sbin/sar:
accessauths = aix.system.stat
innateprivs = PV_DAC_R,PV_DAC_X,PV_KER_WPAR
secflags = FSF_EPS
/usr/bin/ptx_wpar_provider:
accessauths = aix.system.stat
innateprivs = PV_DAC_
secflags = FSF_EPS
/usr/bin/xmwlm:
accessauths = aix.system.stat
innateprivs = PV_DAC_
secflags = FSF_EPS
/usr/sbin/snap:
accessauths = aix.system.stat,aix.ras.snap
innateprivs = PV_AZ_ROOT,PV_DAC_O,PV_DAC_R,PV_DAC_W,PV_DAC_X,PV_KER_ACCT,PV_KER_RAC,PV_PROC_PRIV,PV_PROC_RAC
inheritprivs = PV_AU_PROC,PV_AZ_READ,PV_AZ_ROOT,PV_DAC_,PV_DAC_GID,PV_DAC_O,PV_DAC_R,PV_DAC_W,PV_DAC_X,PV_DEV_CONFIG,PV_DEV_QUERY,PV_FS_CHOWN,PV_FS_MKNOD,PV_KER_ACCT,PV_KER_EXTCONF,PV_KER_LVM,PV_KER_RAC,PV_KER_RAS,PV_KER_VARS,PV_NET_CNTL,PV_NET_PORT,PV_NET_RAWSOCK,PV_PROC_PRIV,PV_PROC_RAC,PV_PROC_TIMER,PV_PROC_VARS
egid = 0
secflags = FSF_EPS
/usr/esa/sbin/sa_snap:
accessauths = aix.system.stat
innateprivs = PV_AZ_ROOT,PV_DAC_O,PV_DAC_R,PV_DAC_W,PV_DAC_X,PV_KER_ACCT,PV_KER_RAC,PV_PROC_PRIV,PV_PROC_RAC,PV_FS_CHOWN
inheritprivs = PV_AU_PROC,PV_AZ_READ,PV_AZ_ROOT,PV_DAC_,PV_DAC_GID,PV_DAC_O,PV_DAC_R,PV_DAC_W,PV_DAC_X,PV_DEV_CONFIG,PV_DEV_QUERY,PV_FS_CHOWN,PV_FS_MKNOD,PV_KER_ACCT,PV_KER_EXTCONF,PV_KER_LVM,PV_KER_RAC,PV_KER_RAS,PV_KER_VARS,PV_NET_CNTL,PV_NET_PORT,PV_NET_RAWSOCK,PV_PROC_PRIV,PV_PROC_RAC,PV_PROC_TIMER,PV_PROC_VARS
secflags = FSF_EPS
/usr/sbin/mailstats:
accessauths = aix.system.stat
innateprivs = PV_DAC_R,PV_DAC_W,PV_DAC_X
secflags = FSF_EPS
/usr/pmapi/tools/hpmstat:
accessauths = aix.system.stat,aix.system.pmustat.global
innateprivs = PV_SU_UID,PV_PMU_CONFIG,PV_PMU_SYSTEM,PV_DAC_R,PV_DAC_W
secflags = FSF_EPS
/usr/bin/iostat:
accessauths = ALLOW_ALL
innateprivs = PV_KER_VARS
authprivs = aix.system.stat=PV_PROC_PRIV
secflags = FSF_EPS
/usr/bin/mpstat:
accessauths = aix.system.stat
innateprivs = PV_DAC_R,PV_DAC_X,PV_KER_WPAR
secflags = FSF_EPS
/usr/bin/amepat:
accessauths = aix.system.stat
innateprivs = PV_AZ_ROOT,PV_DAC_R,PV_DAC_X,PV_DEV_QUERY,PV_KER_ACCT,PV_KER_EXTCONF,PV_KER_RAC,PV_KER_VMM,PV_KER_WPAR,PV_SU_UID,PV_TCB,PV_TP_SET
secflags = FSF_EPS
/usr/bin/svmon:
accessauths = aix.system.stat
innateprivs = PV_AZ_ROOT,PV_DAC_R,PV_DAC_X,PV_DEV_QUERY,PV_KER_ACCT,PV_KER_EXTCONF,PV_KER_RAC,PV_KER_VMM,PV_KER_WPAR,PV_SU_UID,PV_TCB,PV_TP_SET
secflags = FSF_EPS
/usr/bin/topas:
accessauths = ALLOW_ALL
innateprivs = PV_DEV_CONFIG,PV_DAC_O,PV_DAC_R,PV_DAC_X,PV_KER_ACCT,PV_KER_RAS,PV_FS_MKNOD,PV_DEV_QUERY
authprivs = aix.system.stat=PV_PROC_PRIV
secflags = FSF_EPS
/usr/bin/topas_nmon:
accessauths = ALLOW_ALL
innateprivs = PV_DEV_CONFIG,PV_DAC_O,PV_DAC_R,PV_DAC_X,PV_KER_ACCT,PV_KER_RAS,PV_FS_MKNOD,PV_DEV_QUERY
authprivs = aix.system.stat=PV_PROC_PRIV
secflags = FSF_EPS
/usr/bin/tprof:
accessauths = aix.system.stat,aix.system.pmustat.global
innateprivs = PV_DAC_R,PV_DAC_X,PV_PROC_SIG,PV_PMU_SYSTEM,PV_PMU_CONFIG,PV_PROC_PRIV,PV_DAC_W
inheritprivs = PV_DEV_CONFIG,PV_DEV_LOAD,PV_DEV_QUERY,PV_FS_CHOWN,PV_KER_CONF
secflags = FSF_EPS
#
- aix.ras.snap
# grep -p "aix.ras.snap" /etc/security/privcmds
/usr/sbin/snap:
accessauths = aix.system.stat,aix.ras.snap
innateprivs = PV_AZ_ROOT,PV_DAC_O,PV_DAC_R,PV_DAC_W,PV_DAC_X,PV_KER_ACCT,PV_KER_RAC,PV_PROC_PRIV,PV_PROC_RAC
inheritprivs = PV_AU_PROC,PV_AZ_READ,PV_AZ_ROOT,PV_DAC_,PV_DAC_GID,PV_DAC_O,PV_DAC_R,PV_DAC_W,PV_DAC_X,PV_DEV_CONFIG,PV_DEV_QUERY,PV_FS_CHOWN,PV_FS_MKNOD,PV_KER_ACCT,PV_KER_EXTCONF,PV_KER_LVM,PV_KER_RAC,PV_KER_RAS,PV_KER_VARS,PV_NET_CNTL,PV_NET_PORT,PV_NET_RAWSOCK,PV_PROC_PRIV,PV_PROC_RAC,PV_PROC_TIMER,PV_PROC_VARS
egid = 0
secflags = FSF_EPS
#
aix.system.stat は、システム全体の統計情報を参照するための広範な権限です。
そのため、snap だけでなく topas や svmon といったパフォーマンス診断コマンドの実行も許可されるようになります。
2:ユーザーへのロール割り当て
bob ユーザーに作成した SnapRole を付与し、デフォルトで有効になるよう設定します。
# lsuser -a roles default_roles bob
bob roles= default_roles=
# chuser roles=SnapRole default_roles=SnapRole bob
# lsuser -a roles default_roles bob
bob roles=SnapRole default_roles=SnapRole
3:カーネル・セキュリティ・テーブル(KST)の更新
setkst コマンドで反映します。
# setkst
Successfully updated the Kernel Authorization Table.
Successfully updated the Kernel Role Table.
Successfully updated the Kernel Command Table.
Successfully updated the Kernel Device Table.
Successfully updated the Kernel Object Domain Table.
Successfully updated the Kernel Domains Table.
Successfully updated the Kernel RBAC log level.
#
権限に含まれる情報には、ロール、特権コマンドがあり、特権デバイス・データベースは、データがカーネルのセキュリティー・テーブル (KST) として指定されたカーネルの領域にロードされるまで、セキュリティーの考慮事項の対象としては使用されません。 拡張 RBAC モードでは、権限および特権検査がカーネルで行われます。したがって、カーネルでデータベースを使用するために、データベースをカーネルに送信する必要があります。
setkst コマンドはセキュリティー・データベースを読み取り、そのデータベースの情報をカーネルのセキュリティー・テーブル (KST) にロードします。
4: 動作確認
bob ユーザーに切り替えて、実際に snap コマンドが実行できるか確認します。
# su bob
$ whoami
bob
$
- ロールが有効になっているかの確認
$ rolelist -a
SnapRole aix.ras.snap
aix.system.stat
- snap コマンドの実行確認
$ snap
Usage: snap [-@gFGStnfkDpsAliIbBNLRwhHCZXYUM | -u "user1,..." ] [ -z "product_name=productname, ..." | "class=classname, ..." | ALL ] [-o outputdevice] [-d dir] [All |
file:filename | scriptname1 [scriptname2] ...]
snap [-aZ] [-o outputdevice] [-d dir]
snap [-gGStnfkDpsAliIbBNLRwhHCZY] [-c] [-O splitsize] [-d dir] [All |
file:filename | scriptname1 [scriptname2] ...]
snap [-o outputdevice] [-d dir]
snap [-v component]
snap [-c] [-O splitsize] [-d dir]
snap [-r] [-d dir]
~ 省略 ~
Usageが表示され、コマンドが正常に呼び出せるようになりました。
- snap 取得の実行
snap コマンドの -g (general) -c (compression) を実行し /tmp/ibmsupt/snap.pax.gz が生成されることを確認します。
$ snap -gc
/var/adm/ras/trcfile: No such file or directory
Checking space requirement for general information...............................................................................................................................................No such file or directory
/usr/sbin/snap[467]: /tmp/ibmsupt/general/nim/nimsh.log.tmp: cannot create
mv: cannot rename /tmp/ibmsupt/general/nim/nimsh.log.tmp to /tmp/ibmsupt/general/nim/nimsh.log:
No such file or directory
.. done.
.********Checking and initializing directory structure
Creating /tmp/ibmsupt/client_collect directory tree... done.
Creating /tmp/ibmsupt/vfc_client_collect directory tree... done.
Creating /tmp/ibmsupt/nvme_collect directory tree... done.
Creating /tmp/ibmsupt/scsidisk_collect directory tree... done.
Creating /tmp/ibmsupt/dpcom_collect directory tree... done.
Creating /tmp/ibmsupt/general directory tree... done.
Creating /tmp/ibmsupt/general/diagnostics directory tree... done.
Creating /tmp/ibmsupt/general/nim directory tree... done.
Creating /tmp/ibmsupt/pcixscsi directory tree... done.
Creating /tmp/ibmsupt/sissas directory tree... done.
Creating /tmp/ibmsupt/testcase directory tree... done.
Creating /tmp/ibmsupt/other directory tree... done.
********Finished setting up directory /tmp/ibmsupt
Checking Space requirement for client_collect
Checking Space requirement for vfc_client_collect
Checking Space requirement for nvme_collect
Checking Space requirement for scsidisk_collect
Checking Space requirement for dpcom_collect
Checking for enough free space in filesystem... done.
/var/adm/ras/trcfile: No such file or directory
Gathering general system information................................................................................................................................................. done.
Gathering platform/scanout information.done.
Gathering client_collect data
Gathering vfc_client_collect data
Gathering nvme_collect data
Gathering scsidisk_collect data
Gathering dpcom_collect data
Gathering pcixscsi system information....... done.
Gathering sissas system information...... done.
Creating compressed pax file...
Starting pax/compress process... Please wait... done.
-rw------- 1 207 0 1465127 Mar 17 02:19 snap.pax.gz
$
- 確認
所有者が bob の snap ファイルが正しく作成されています。
$ ls -l /tmp/ibmsupt/snap.pax.gz
-rw------- 1 bob system 1465127 Mar 17 02:19 /tmp/ibmsupt/snap.pax.gz
おわりに
AIXの Enhanced RBAC を利用することで、root 権限(sudo等)を丸ごと与えることなく、特定のコマンド(今回は snap )のみを一般ユーザーに安全に委譲することができました。
運用保守において、snap コマンド実行のみを特定ユーザーに任せたい場合などの手法としてご参考いただければと思います。
[参考]