anchor
rootログインを不可にする〜それとOSXのrootの安全性について
OSXはUNIXをベースにしたOSだということはどういうことなのか、何度か書いた。
その中のひとつで「UNIXコマンド入門」のページでrootの権限の意味と能力についてsudo:ルート権限で実行するという記事で詳述した。
その上でsu:ルートになるという記事でTerminal上でもGUIでもrootになる方法を書いた。
その意味はそちらの記事を読んでもらいたいのだが、私の場合システム管理上やはりいろいろ便利だということもあってrootは有効にしている。
個人持ちの一人で使っているiBookは別にそれで良いのだが、自宅のネットに常時接続しているMac miniは家族それぞれにアカウントを発行しているし、さらに会社でFinalCutProやProToolsなどを動かしている業務機などの管理もやっている。
こうした業務機は当然不特定多数のユーザが操作することになる。
(当然管理者ユーザと一般ユーザにアカウントは分けているが)
その場合rootを有効にしているのはセキュリティ上どうなのか、問題を感じたのでとりあえずrootを無効にする方法を調べた。
実は有効にする時のようにコマンド一発で変更できるスマートな方法を知らない。
今まで必要も感じなかったので調べていなかったのだが、少なくとも複数が使う機械は閉じることにした。
それで調べてみたところ「rootの無効化」はNetInfo Managerというユーティリティフォルダにバンドルされているアプリを使うことが分かった。
方法は以下の通りキャプチャーで説明する。
「rootの無効化」はシステムにバンドルされているNetInfo Managerを使う
"/Applications/Utilities/"にあるこのアプリを起動する
NetInfo Managerを起動するとまず左下の鍵アイコンをクリックして解除
rootのパスワードを要求される
認証を解除したらメニューバーの「セキュリティ」から「ルートユーザを無効」をクリックする
表示が「ルートユーザを有効」に変わったらもう一度鍵アイコンをクリックして南京錠を閉じる
これでrootは無効になるし再び有効にするにはもう一度この手順で「有効」にすればいい
結局コマンドでrootを無効化する方法は分からなかったのだがNetInfo Managerで非常に簡単に無効化できることが分かったのでこれで対応することにした。
またこの方法で無効化すると今度は
sudo passwd root
のようなコマンドをもう一度打ってもrootは有効にならないので安全性は若干高まるかもしれないというおまけもついた。もう一度rootを有効にするにはこの手順を繰り返してNetInfo Managerで有効化するしかないようだ。
これで確かにrootは無効になるがこんな問題点を感じてしまった。
Terminalでsuというrootになるコマンドが有効か試してみた
一番上の最初のsuはNetInfo Managerを操作する前なのでrootにログインできている
二つ目のsuはNetInfo Managerでrootが無効になったためにログインできなかった
ただsudo suというコマンドを打ってみたらなんとこの状態でもrootにログインできた
ここで大いに疑問を感じた
MacOSXで「rootを無効にするTips」という記事ならここでOKで、この記事完了である。
確かに無効になっている。
しかしキャプチャーのように
sudo su
というコマンドを打ったら無効化した状態でもrootになれてしまうことが分かった。
そうするとよく教科書的にあちこちで解説されている、
「rootを有効にするとリスクがあるので、セキュリティの確保のためにrootは有効にしない方が良い」
というセオリーは単なる迷信だということにならないだろうか。
(リンク先の別項で私自身もそういう解説を書いてしまったが)
rootを有効にしなくたって
sudo su
のような非常に簡単なコマンドでルートになれてしまうわけだから、あたかも「無効にしておけば安全」と思わせるようなこんな解説は誤解の元だと思う。
正直ウチのユーザでTerminalを開けて何かをしようというレベルの人は会社でも家族でも皆無なので、キーボードに触れるユーザがTerminalで何か悪さをするとは考えにくいのだが、だからそんなに神経質になる必要はないのかもしれないが、こういう仕様の場合どういうリスクがあるかは考えておいた方が良いと感じた。
それでやはり心配なのはある種のroot権限を乗っ取って特定の動作を勝手に実行してリモートを取られてしまうようなスクリプトを実行されるというリスクが、一番心配だと思う。
こういう
sudo su
で簡単にルートになれてしまうといってもやはりそれはrootのパスワードを抜かれない限りは大丈夫だ。
だからリアルなユーザの不正使用に対してはrootのパスワードを教えるか否かで対処できる。
特に不特定多数が使う可能性がある会社機の場合は管理者ユーザと一般ユーザにアカウントを分けて、普段の作業は一般ユーザにやってもらうことにしている。
それで一般ユーザと管理者ユーザのログインパスワードも違うものを使っている。
こうすると一般ユーザは自分の意志でアプリなどをインストールできないという不便さはあるが、そういう端末に好き勝手にリッピングソフトだの訳の分からないものをインストールされるリスクも防げるので、こうしている。
おそらくそういうフィジカルなリスクはこの方法で回避できる。
上記のそういうユーザがわけの分からないリスキーなファイルをインターネットからダウンロードしてきて、それで勝手にある種のスクリプトをTerminalで実行されてしまうというリスクも、この方法である程度回避できる。
一般ユーザでTerminalにsuのコマンドを打っても
「あなたは管理者ユーザではない。この操作は管理者に報告される」
というアラートが出るだけでログインできない。
しかし管理者ユーザだってそういう罠にはまらないとも限らないので、もう一段踏み込んだ対策が必要だと感じた。
それがTipsのページに採録したTerminalを自動起動して悪意あるコードを実行されるリスクを回避するコードという記事と
未公認だが存在するTerminalの認証の弱点を防ぐという記事に書いた、
「root認証を5分間猶予するというシステムの仕様を無効化する方法」
というTerminalでクリティカルなスクリプトを実行されないという二つの方法だ。
これを二つとも実行するのが望ましいと思う。
そう思う根拠は上記のように
sudo su
というコマンドがrootを有効にしていなくても実行できてしまうということだ。
思うにOSXのsudoは多くの権限を持たされ過ぎている。
大抵のUNIXの場合は管理者ユーザ以外は勿論suのようなコマンドもsudoも許されていないが、OSXではインストール後デフォルトでログインできるアカウントがいきなり管理者ユーザだ。
普通の人はこの状態で使っているに違いない。
例えば自動的にTerminalを起動して
sudo su
のようなコマンドを実行するスクリプトを悪意あるサイトから自動ダウンロードされるような、そんなサイトに行ってしまったとする。
Safariの
「安全なファイルをダウンロード後自動的に開く」
という素っ頓狂な設定を外していなかったとして、自動的に解凍されたスクリプトが何かの弾みで実行されるような仕組みを持っていたとする。
そしてTerminalを起動して
sudo su
のようなコマンドを勝手に実行するとする。
OSXの場合は一度認証をすると5分間は次に認証を必要とするような操作をしてもパスワードを要求されないという、これまた素っ頓狂な設定になっている。
たまたまこの5分以内に何かの認証でパスワードを入力していたら、このスクリプトの
sudo su
はなんら問題なく実行されてしまう。
そうなると後はクラッカーの思い通りだ。
rm -rf /
というようなコマンドを実行されて、一瞬にしてハードディスクの中身はすべて失われるといういたずらもできる。
またパスワードを抜くキーロガーを仕込んだり、sshなどのアクセスを許可して外部から自由に乗っ取れるという可能性すらある。
これを防ぐもっとも有効な方法はやはり上記の
「Terminalを勝手に起動実行させない」
という方法と
「どんな場合でもroot権限を要する操作にはパスワードの入力を省略しない」
という二つのセキュリティをかけるのが一番確実な方法だと思う。
会社機の場合はゲートウエイの下にあるマシンなので、そんなに簡単に外部から乗っ取れるとも思えないのだが、悪意あるコードを実行される可能性はゼロにしたいなら考慮した方がいいと考えて、先日会社機並びに自宅のMacはすべてそのようにした。
もう一度強調しておくが
rootを有効にしているか無効にしているかはMacOSXの場合セキュリティの安全度には無関係だと思われる。
無効にしていてもどうも危険度は変わらないようだ。
このことは意外に知られていない気がするが、そう感じた。
リンク先にその手順と理由は詳述しているが、ここでもう一度手順だけ再度引き写しておく。
1)Terminalを自動起動して悪意あるコードを実行されるリスクを回避するコード
Coelaなどの不可視ファイルも操作できるファイルブラウザを使って
"/private/etc/bashrc"
または
"~/.bash_profile"
を表示、これをSmultronなどのシステムファイルもエディットできるテキストエディタにドロップして編集できる状態にする。
その文末に以下の文字列をコピぺするだけで良い。
上書き保存にはルート権限を要求されるが、これはパスワード認証できる。
# keep my playground secure
echo "############################################################";
echo "## ##";
echo "## If you do not know why Terminal has launched, answer ##";
echo "## 'n' to the following question. Otherwise, hit 'y' to ##";
echo "## open Terminal as usual... ##";
echo "## ##";
echo "############################################################";
echo "Open Terminal.app now (y/n)";
read -r -t 15 -e OpenTerminal
if [ "$OpenTerminal" == "" ] || [ "$OpenTerminal" == "n" ]; then
exit 1;
fi;
if [ "$OpenTerminal" != "y" ]; then
LastCommand="$OpenTerminal";
echo "Open Terminal.app now (y/n)";
read -r -t 15 -e OpenTerminal
if [ "$OpenTerminal" == "y" ];then
echo "This was the command that started Terminal.app:";
echo $LastCommand;
else
exit 1;
fi;
fi;
そうすることでTerminalが起動する時にキャプチャーのようにアラートを表示するようになる。
Coelaを使って"/private/etc/bashrc"をSmultronにドロップ
そしてこういう文字列を追記する
上書き保存にはrootの認証を要求される
そうするとTerminalを起動するたびにこういうアラートを表示するようになる
これで悪意あるコードを勝手に実行されるということは防げる
2)5分間のsudoの認証猶予を無効にする
/etc/sudoersを開いて"Defaults"スペシフィケーションに
Defaults:ALL timestamp_timeout=0
と追記する。
追記する方法はTerminalを起動して
suまたはsudo su
コマンドでまずrootでログインしておく。
次に
visudo
とコマンドを打つ
すると
/etc/sudoersがTerminalのデフォルトのテキストエディタのviで開かれ待機画面になる。
iキーを叩くとインサート編集モードに入る
この状態で
#Defaults specification
と書かれたセクションに
Defaults:ALL timestamp_timeout=0
という文字列をコピーペーストする。
以上が完了したらescキーを叩いて編集モードから出る。
この状態で保存する場合は
:wq
とキーを叩き一番下のプロンプトにその通りに表示されたのを確認したらenterキーでvisudoを終了する。
変更を保存しないで元のままで終了したい場合は
:q
とだけキーを打ってenterキーで実行すれば、変更は保存されないでvisudoを終了することができる。
sudoersの編集はTerminalを起動してvisudoコマンドで実行する
visudoはルートでログインしないと使えないが
そのコマンドはUNIXのスタンダードなエディタのviと同じだ
iで編集モードに入ってラインを書き込み:wqで保存して終了だ
これを実行するとsudoコマンドを入力するたびにいちいちパスワードを
要求されるようになってしまうが上記の未知のスクリプトの脅威は減少する
それにポカミスでsudoでやってはいけないコマンドを実行してしまうのを
未然に防ぐというフールプルーフにもなるかもしれない