sudoers でプロセス起動専用ユーザと一般ユーザの権限管理

sudoers 設定

基本は visudo コマンドで編集する。vi と同じ方法で編集可能です。ファイルを閉じたタイミングで構文チェックをしてくれます。

権限毎に設定ファイルを分ける

設定が増えたときのために、ファイルを分けて編集する形にした。読み込む順番が分からなかったので、プレフィックスに連番を付けておいた。

# ls -l /etc/sudoers.d/
total 8
-r--r----- 1 root root 458 Dec 10 14:33 000_alias
-r--r----- 1 root root 101 Dec 10 15:02 001_devops

/etc/sudoers.d/000_alias

設定に利用するエイリアスの定義をまとめておく。対象ユーザ、実行ユーザ、ホスト、コマンドなどを定義する。

# User alias specification
User_Alias   DEVOPS = yulii

# Runas alias specification
Runas_Alias  SU     = root
Runas_Alias  ANGEL  = angel

# Host alias specification
Host_Alias   LO     = 127.0.0.1

# Cmnd alias specification
Cmnd_Alias   SH     = /bin/sh, /bin/bash
Cmnd_Alias   KILL   = /bin/kill
Cmnd_Alias   APP_YULII = /var/opt/angel/build_yulii_production

/etc/sudoers.d/001_devops

アカウント単位で、sudo 可能なホスト、実行ユーザ、コマンドを制限する。ALL 指定できるが、不要な権限は付与せず、必要なものだけを許可しておく。

DEVOPS    LO = (ANGEL) NOPASSWD: SH, APP_YULII, (SU) PASSWD: KILL

エイリアス DEVOPS で定義されたユーザに、ホスト LO 上でsudo 権限を付与した。ANGEL 権限で SHAPP_YULII をパスワード認証なしの実行許可、SU 権限で KILL をパスワード認証付きの実行許可。

実行スクリプト

Yesod アプリケーションをビルドするスクリプトを用意する。sudo からの実行権限は上記で設定済み。(本当は、Jenkins 立てて自動化する方が柔軟性があって良いと思う。)

/var/opt/angel/build_yulii_production

$APP_ROOT は適宜設定する。

#!/bin/bash
pull() {
  cd $APP_ROOT && git pull
}
clean() {
  cabal clean
}
install() {
  cabal install --only-dependencies
}
reinstall() {
  cabal update && cabal install --only-dependencies --force-reinstalls
}
build() {
  cabal configure && cabal build
}

source $HOME/.bash_profile  # 実行に必要なパスはあらかじめ用意しておく
case "$1" in
  upgrade)  pull && clean && reinstall && build ;;
  *)        pull && clean && install && build ;;
esac

実行コマンド

通常のビルド

sudo -u angel /var/opt/angel/build_yulii_production

依存モジュール変更時のビルド

cabal updatecabal install --force-reinstalls も一緒に実行する。

sudo -u angel /var/opt/angel/build_yulii_production upgrade