バリケンのRuby日記 RSSフィード

2006-06-10

[] QuickMLソースコードを読む(3) /usr/sbin/quickmlの続き  QuickMLのソースコードを読む(3) /usr/sbin/quickmlの続き - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  QuickMLのソースコードを読む(3) /usr/sbin/quickmlの続き - バリケンのRuby日記  QuickMLのソースコードを読む(3) /usr/sbin/quickmlの続き - バリケンのRuby日記 のブックマークコメント

昨日のエントリの続きだよ。

be_secureメソッド

def be_secure (config)
  return unless Process.uid == 0
  uid = Etc::getpwnam(config.user).uid
  gid = Etc::getgrnam(config.group).gid
  touch(config.pid_file)
  touch(config.log_file)
  File.chown(uid, gid, config.data_dir)
  File.chown(uid, gid, config.pid_file)
  File.chown(uid, gid, config.log_file)
  Process.uid  = uid
  Process.gid  = gid
  Process.euid = uid
end

これは、プロセスファイルの権限を安全なものに変更するbe_secureメソッドの定義だね。まずProcess::uidメソッドでプロセスuidを調べて、0でないなら(rootじゃないなら)メソッド終了。rootの場合は、configオブジェクトuserインスタンスにあるユーザー名のuidgidEtc::getpwnamメソッドとEtc::getgrnamメソッドで/etc以下から取得して、昨日の日記で定義したtouchメソッドで空のpidファイルlogファイルを作成して、configオブジェクトのdata_dir、pid_file、log_fileインスタンス(アクセサQuickML::Config#data_dir、QuickML::Config#pid_file、QuickML::Config#log_fileを使ってアクセス)で指定するファイルまたはディレクトリのオーナーを先ほどのuid,gidに変更して、最後にProcess::uidメソッドとProcess::gidメソッドを使ってプロセスの実ユーザID、実効ユーザIDuidに設定、Process::euidメソッドを使って実グループIDgidに設定しているよ。

要するに、rootで起動したとしてもプロセスの権限や生成するファイルディレクトリを安全なユーザーグループの権限にする、という動作をするんだね。

とりあえず今日はここまで。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20060610