試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

特定のユーザアカウントについてテキストログイン時に行える操作を制限する

一般的なユーザアカウントでは、テキストログインをしたときにシェル(GNU/Linuxでは多くの場合bash)が起動し、そのユーザの権限で任意のコマンドを実行できるようになる。
もし、運用上の事情により特定のユーザに限られた操作だけができるようにしたいということがある場合、以下の2つを行う必要がある。

  • 特定の操作だけができるようなプログラム(各種スクリプト含む)を作成し、実行属性を付けて配置しておく(かつ、そのユーザからはそれが書き込めないようにする)
  • ログインシェルをそのプログラムの場所に指定

認証後シェルに入る設定のままでシェルの初期化ファイルからプログラムが自動起動されるようにしても、それが終了するとシェルに戻るので、その対処ができていないといけない。それよりはログインシェル自体を変えたほうがやりやすい。
以下、例として、/usr/local/bin/customshellというファイル名で実行ファイルを配置し、そのユーザからはbashのようなシェルの代わりにこのプログラムが実行されるようにするものとする。

プログラムの準備

ユーザが幾つかの選択肢の中から1つを選ぶような形で作業を進めるものとして、以前「シェルスクリプトでユーザからの入力を受け付け、複数の階層を持ったメニューを作る」で作成したスクリプトがある。このような形をもとにしてユーザに行わせたい作業の実行処理を選択肢ごとに記述する形のシェルスクリプトを作るのがよいかもしれない。流れは以前のスクリプトから一部変えている。
以下は例だが、使い方に合わせて編集する必要がある。
[任意]ファイル名: /usr/local/bin/customshell

#! /bin/sh

show_mainmenu()
{
  while true; do
    cat <<EOF

[メインメニュー]
1:ログ参照
2:再起動
3:ログアウト
数字を入力してください
EOF
    # キー入力をACT_MAINに代入
    read ACT_MAIN
    # キー入力された値によって分岐
    case ${ACT_MAIN} in
     1)
      show_submenu_logview
      break
      ;;
     2)
      # 再起動
      echo "再起動します"
      reboot
      break
      ;;
     3)
      # スクリプトを終了しログアウトする
      break
      ;;
     *)
      printf "エラー: 無効な項目 \"%s\" が入力されました\n" "${ACT_MAIN}"
      ;;
    esac
  done
}

show_submenu_logview()
{
  while true; do
    cat <<EOF

[ログ参照メニュー]
1:アクセスログ参照
2:セキュリティログ参照
3:メインメニューに戻る
数字を入力してください
EOF
    read ACT_SUB_LOGVIEW
    case ${ACT_SUB_LOGVIEW} in
     1)
      echo "アクセスログを参照します"
      # ここにアクセスログ参照のコマンド行を記述
      ;;
     2)
      echo "セキュリティログを参照します"
      # ここにセキュリティログ参照のコマンド行を記述
      ;;
     3)
      show_mainmenu
      break
      ;;
     *)
      printf "エラー: 無効な項目 \"%s\" が入力されました\n" "${ACT_SUB_LOGVIEW}"
      ;;
    esac
  done
}

# ここから処理開始
show_mainmenu

注意点としては、例えばログファイルの類をページャで参照するような項目を作る場合にlessのような子プロセスを起動可能なものを用いてしまうと行動を制限する意味がなくなる可能性がある(lessにはテキストエディタを起動する機能がある)。lessでは「:e」の入力に続けてファイルの場所を入力することにより、新しく任意のファイルを開くこともできたりするので、行動を制限するときに使うのは難しいかもしれない。
既存のページャをどうしても使いたいのであれば、そのソースを強引に修正してビルドするという方法もあるが、このあたりはどのように運用したいかによって対処も変わってくる。

ログインシェルの設定

テキストログイン時の認証を通ったときに実行されるプログラムがログインシェルで、/etc/passwdの「:」で区切られた一番右の項目の場所(パス)にあるプログラムとなる。ユーザが作成済みであればvipwでそのユーザに関する行のその項目を編集し、新規ユーザであれば

$ sudo useradd -m -d /home/user -s /usr/local/bin/customshell user
$ sudo passwd user
ユーザー user のパスワードを変更。
新しいパスワード:(パスワードを入力してEnter)
新しいパスワードを再入力してください:(パスワードを入力してEnter)

などのようにuseraddコマンドの-sオプションでログインシェルをユーザ作成時に設定できる。
これでそのユーザでテキストログインしたときにそのプログラムが実行され、限られた処理のみしかできなくなる。

関連記事: