概要・前提

Solaris のユーザー管理は Linux と類似した /etc/passwd/etc/shadow/etc/group に加え、Solaris 独自の RBAC(Role Based Access Control)機能があります。Solaris 11 からは useradm コマンドも利用できます。

主要ファイル一覧

ファイル 内容
/etc/passwd基本ユーザー情報
/etc/shadowパスワードハッシュ・期限情報
/etc/user_attrRBAC 属性(roles・profiles・authorizations)
/etc/security/auth_attr認可定義
/etc/security/prof_attrプロファイル定義
/etc/security/exec_attr実行属性(特権付きコマンド)

ユーザー一覧の取得

全ユーザー一覧(/etc/passwd)

awk -F: '{printf "%-20s UID=%-6s GID=%-6s HOME=%-25s SHELL=%s\n", $1,$3,$4,$6,$7}' /etc/passwd

UID 100 以上の一般ユーザーのみ(Solaris 標準 UID 範囲)

awk -F: '$3 >= 100 && $3 < 65534 {print $1, $3, $6, $7}' /etc/passwd

Solaris 11: useradm list

# Solaris 11 以降
useradm list

グループ一覧の取得

awk -F: '{printf "GROUP=%-20s GID=%-6s MEMBERS=%s\n", $1,$3,$4}' /etc/group

ロック状態の確認

Solaris の shadow ファイルでは、パスワードフィールドが *LK* の場合がロック状態です。

passwd コマンドでステータス確認

# 特定ユーザー
passwd -s username

# 全ユーザーのステータス一覧
passwd -sa

出力の第2フィールドの意味は以下のとおりです。

表示 意味
PSPassword Set(有効)
LKLocked(ロック済み)
NPNo Password(パスワードなし)
UPUnable to get status

shadow ファイルからロックユーザーを直接抽出

sudo awk -F: '$2 ~ /\*LK\*|^!/ {print "LOCKED:", $1}' /etc/shadow

ロック・アンロック

# ロック
passwd -l username

# アンロック
passwd -u username

最終ログイン日時

last コマンドで確認

# 直近のログイン履歴
last

# 特定ユーザー
last username

lastlog コマンド(Solaris 10 以降)

lastlog

# 特定ユーザー
lastlog -u username

who -a / finger コマンド

# 現在ログイン中のユーザー
who -a

# ユーザー情報(finger が利用可能な場合)
finger username

特権の確認

Solaris の特権管理は UID=0 の root に加え、RBAC の ロール(role)プロファイル(profile)認可(authorization)で細かく制御されます。

UID=0 のアカウントを確認

awk -F: '$3 == 0 {print "UID=0:", $1}' /etc/passwd

root グループのメンバー確認

grep '^root:' /etc/group

/etc/user_attr で RBAC 属性を確認

# roles / profiles / auths が設定されているユーザーを確認
cat /etc/user_attr

# ロール付与されたユーザーのみ抽出
grep 'roles=' /etc/user_attr | grep -v '^#'

ユーザーのプロファイル・認可を確認

# 特定ユーザーの権限情報を確認
profiles username
auths username
roles username

sudo 権限 / RBAC

Solaris では sudo の代わりに RBAC の pfexec(Profile Execute)が推奨されます。ただし sudo も利用可能です。

sudo の確認

cat /etc/sudoers
ls /etc/sudoers.d/ 2>/dev/null
grep -r 'NOPASSWD' /etc/sudoers /etc/sudoers.d/ 2>/dev/null

RBAC プロファイルの確認(pfexec)

# 全ユーザーのプロファイルを確認
for user in $(awk -F: '$3 >= 100 {print $1}' /etc/passwd); do
  pf=$(profiles "$user" 2>/dev/null | tr '\n' ',' | sed 's/,$//')
  echo "$user: $pf"
done

Primary Administrator ロールのユーザーを確認

grep 'roles=Primary Administrator' /etc/user_attr

exec_attr でコマンド権限を確認

cat /etc/security/exec_attr | grep -v '^#' | grep -v '^$'

パスワード期限

passwd -sa で全ユーザーのパスワード情報を表示

passwd -sa

shadow ファイルから直接確認

# /etc/shadow のフィールド構成:
# user:pw:lastchg:min:max:warn:inactive:expire
sudo awk -F: '{printf "USER=%-20s LASTCHG=%-8s MIN=%-5s MAX=%-5s WARN=%-5s EXPIRE=%s\n",$1,$3,$4,$5,$6,$8}' /etc/shadow

パスワード無期限(max=99999)ユーザーを抽出

sudo awk -F: '$5 == 99999 || $5 == "" {print "NO EXPIRY:", $1}' /etc/shadow

デフォルトポリシーの確認

grep -E 'MAXWEEKS|MINWEEKS|PASSLENGTH|WARNWEEKS' /etc/default/passwd

一定期間未使用ユーザー

lastlog で 90 日以上未ログインを抽出

lastlog -b 90 2>/dev/null | grep -v 'Username' | grep -v 'Never logged in'

shadow ファイルから最終パスワード変更日で判定

TODAY=$(( $(date +%s) / 86400 ))
sudo awk -F: -v today="$TODAY" '
  $3 != "" && $3 > 0 {
    diff = today - $3
    if (diff > 90) printf "USER=%-20s LAST_PW_CHANGE=%s days ago\n", $1, diff
  }
' /etc/shadow

無効化されたユーザー

ロック中ユーザーを抽出

passwd -sa | awk '$2 == "LK" {print "LOCKED:", $1}'

nologin シェルのユーザーを確認

awk -F: '$7 ~ /nologin|false/ {print "NOLOGIN:", $1, $7}' /etc/passwd

アカウント有効期限切れのユーザーを確認

# shadow 第8フィールド:アカウント有効期限(1970/01/01 からの日数)
TODAY=$(( $(date +%s) / 86400 ))
sudo awk -F: -v today="$TODAY" '
  $8 != "" && $8 > 0 && $8 < today {
    print "EXPIRED:", $1
  }
' /etc/shadow

アカウントの有効化・無効化

# ロック
passwd -l username

# アンロック
passwd -u username

# nologin シェルで無効化
usermod -s /usr/sbin/nologin username