初期状態

素のLinux Kernel + BusyBoxの環境では、最初のプロセス(PID 1)をUID 1で実行している。これは ps コマンドを使用することで確認することができる。

$ ps a
PID   USER     TIME  COMMAND
    1 0         0:01 /bin/sh
    2 0         0:00 [kthreadd]
    3 0         0:00 [pool_workqueue_]

他にも、id コマンドを使用することで、現在の UID や GID を確認することができる。

$ id
uid=0 gid=0

Kernel 側からしたら UID しか見ていないためユーザー名とかの名前解決は ユーザー空間 側で処理する必要がある。 また、UID 0 は root ユーザーということになっており、UID 0 の場合のみ特権がある状況となっている。

/etc/passwd が無い状態

/etc/passwd が無い状態では以下のような事象が発生する。

動かないこと

  • login : 認証に /etc/passwd/etc/shadow が必要なので機能しない
  • su : UID 0 という実質 root というユーザーの ID は存在するが、root というユーザー名は定義されていないので、実行されない。
  • addgroup : /etc/group もなければグループ操作もできない。

動くこと

  • シェル自体は普通に使える(UID 0 で全権限があるため)
  • ファイルの読み書き、プロセス起動、ネットワーク操作、すべてできる
  • ls -l するとファイルの所有者が名前ではなく数値で表示される(01000 など)

改めて述べると、/etc/passwd が無い状態では、UID 0 で全部動いている状態。

セットアップ

まずは、BusyBoxの_installディレクトリ内で rootfs に関する準備を行う。 /etc/passwd に以下のように記述する。

root:x:0:0:root:/root:/bin/sh
totosuki:x:1000:1000::/home/totosuki:/bin/sh

コロンで区切られた各項目の設定は以下の通り。

ユーザー名:パスワード(xの場合は/etc/shadowを参照する):UID:GID:コメント:ホームディレクトリ:ログイン後に実行するプログラム

/etc/group に以下のように記述する。

root:x:0:
totosuki:x:1000:

コロンで区切られた各項目の設定は以下の通り。

グループ名:パスワード(xの場合は/etc/shadowを参照する):GID:メンバーリスト(このグループに追加するユーザー名をカンマ区切りで書く)

第4項目が空なのは、root が /etc/passwd 側で GID 0 をプライマリグループとして指定済みだc/からである。 (プライマリグループというのは、ユーザーが所属するメインのグループのこと)

/etc/shadow に各ユーザーに対するパスワードを設定する。例として root ユーザーのパスワードを設定する。 各パスワードはハッシュ化されている必要があるため、ハッシュ値をホストPC上で設定する。

openssl passwd -6 <PASSWORD>

/etc/shadow に以下のように記述する。

root:PASSWORD:0:0:99999:7:::

コロンで区切られた各項目の設定は以下の通り。

ユーザー名:パスワードハッシュ:最終変更日:最短変更感覚:最大有効期間:警告期間:猶予期間:アカウント有効期限:予約フィールド

また、initramfs の /init を以下のように設定することで、カーネル起動時にログインをすることができる。

setsid cttyhack /bin/login

initramfs で /bin/sh のジョブコントロール https://wiki.mma.club.uec.ac.jp/moba/cttyhack