Ruby On Rails のアプリでは、プロジェクトディレクトリで "rails console" と入力することで、rails コンソールに切り替わります。
一部のユーザだけが rails コンソール を使えるようにしたいのですが、この部分に認証をかけることは可能でしょうか。
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 権限を持つ人以外には実行できなくすることも可能です。
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の認証機構で行う必要があるとは思います。
完全な対応は難しいですよね。頂いたアドバイス、参考になりました。
それから、ソースコードへのリンクまで作成して頂き、ありがとうございました。
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 権限を持つ人以外には実行できなくすることも可能です。
> unix 系の OS を知ってる人であれば、突破するのはさして難しいガードではありませんが
そうなんですよね。「いい案思いついた! ..と思ったけどだめだ」となっておりました。
アドバイスと具体的なスクリプトをありがとうございました。
> unix 系の OS を知ってる人であれば、突破するのはさして難しいガードではありませんが
2012/05/14 00:50:37そうなんですよね。「いい案思いついた! ..と思ったけどだめだ」となっておりました。
アドバイスと具体的なスクリプトをありがとうございました。