"rails console", "rails s" コマンドにパスワード認証を付けるには?


Ruby On Rails のアプリでは、プロジェクトディレクトリで "rails console" と入力することで、rails コンソールに切り替わります。
一部のユーザだけが rails コンソール を使えるようにしたいのですが、この部分に認証をかけることは可能でしょうか。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/05/14 00:51:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.2

回答回数4974ベストアンサー獲得回数2154

ポイント100pt

unix 系の OS でしか通用しませんが、rails コマンドを alias で別のスクリプトにとばして、そこで実行の可否を実装する、という手があります。

ログインシェルが、csh であれば、~/.cshrc で rails を別のスクリプトに置き換えます。

alias rails rails_wrapper

別のスクリプト (仮に、rails_wrapper としてます) は、こんな感じ。

#! /usr/bin/sh

RAILS="/usr/bin/rails"			# 本当の rails コマンドがあるパス

PASSWORD_DIGEST="9bca44b92764dfe762d858fbcb028bf2e3f376a3"


if [ "$1" == "console"  -o "$1" == "s" ]
then
    stty -echo > /dev/null 2>&1
    printf "Password: "
    read pass
    stty echo > /dev/null 2>&1
    if [ "`echo $pass | openssl dgst -sha1`" == "$PASSWORD_DIGEST" ]
    then
        $RAILS $*
    else
        echo "You cannot use this command."
    fi
else
    $RAILS $*
fi

簡単なスクリプトですが、作り方でパスワードの入力を求めるのではなく、特定のユーザID だけが実行できるようにもできます。
unix 系の OS を知ってる人であれば、突破するのはさして難しいガードではありませんが、ある程度の抑止力にはなると思います。

さらにきつくするなら、rails コマンドを、特定のユーザだけが実行できるようにした、ラッパーになるスクリプトで実行時ユーザID を設定しておけば、root 権限を持つ人以外には実行できなくすることも可能です。

id:kitokitoki

> unix 系の OS を知ってる人であれば、突破するのはさして難しいガードではありませんが

そうなんですよね。「いい案思いついた! ..と思ったけどだめだ」となっておりました。
アドバイスと具体的なスクリプトをありがとうございました。

2012/05/14 00:50:37

その他の回答1件)

id:TransFreeBSD No.1

回答回数668ベストアンサー獲得回数268

ポイント100pt

rubyもrailsもいまいちなので、もっとスマートな方法あるかもしれませんが。
consoleは

serverは

あたりが呼ばれるので、ここでパスワード認証かければ良いかと思います。
パスワード認証は簡単なところだと

あたり参考に、例えばパスワード固定ですけど

    def start
      require "highline"
      require 'digest/sha1'
      pass = HighLine.new.ask('Password: ') {|q| q.echo = '*' }
      pass = Digest::SHA1.hexdigest pass
      if pass != "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684" # pass
        puts "Unauthorized"
        exit(1)
      end

とか。
通常の様なユーザー管理とかが必要なら、それ相応のライブラリとか必要になるでしょう。

ただ、それなりに構造を把握してれば、回避も可能だと思うので、そういった意図的なものも防ごうと思うなら、 rails/commands/console.rb とかの読み込みを禁止するとか、プロジェクトのファイルの読み書きも最小限に管理するとか、OSの認証機構で行う必要があるとは思います。

id:kitokitoki

完全な対応は難しいですよね。頂いたアドバイス、参考になりました。
それから、ソースコードへのリンクまで作成して頂き、ありがとうございました。

2012/05/14 00:46:08
id:a-kuma3 No.2

回答回数4974ベストアンサー獲得回数2154ここでベストアンサー

ポイント100pt

unix 系の OS でしか通用しませんが、rails コマンドを alias で別のスクリプトにとばして、そこで実行の可否を実装する、という手があります。

ログインシェルが、csh であれば、~/.cshrc で rails を別のスクリプトに置き換えます。

alias rails rails_wrapper

別のスクリプト (仮に、rails_wrapper としてます) は、こんな感じ。

#! /usr/bin/sh

RAILS="/usr/bin/rails"			# 本当の rails コマンドがあるパス

PASSWORD_DIGEST="9bca44b92764dfe762d858fbcb028bf2e3f376a3"


if [ "$1" == "console"  -o "$1" == "s" ]
then
    stty -echo > /dev/null 2>&1
    printf "Password: "
    read pass
    stty echo > /dev/null 2>&1
    if [ "`echo $pass | openssl dgst -sha1`" == "$PASSWORD_DIGEST" ]
    then
        $RAILS $*
    else
        echo "You cannot use this command."
    fi
else
    $RAILS $*
fi

簡単なスクリプトですが、作り方でパスワードの入力を求めるのではなく、特定のユーザID だけが実行できるようにもできます。
unix 系の OS を知ってる人であれば、突破するのはさして難しいガードではありませんが、ある程度の抑止力にはなると思います。

さらにきつくするなら、rails コマンドを、特定のユーザだけが実行できるようにした、ラッパーになるスクリプトで実行時ユーザID を設定しておけば、root 権限を持つ人以外には実行できなくすることも可能です。

id:kitokitoki

> unix 系の OS を知ってる人であれば、突破するのはさして難しいガードではありませんが

そうなんですよね。「いい案思いついた! ..と思ったけどだめだ」となっておりました。
アドバイスと具体的なスクリプトをありがとうございました。

2012/05/14 00:50:37

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません