2013-10-30

sudoを使わない理由

概要
弊ブログを見て戴いている方には
「なんでこの人はLinux使っているのにsudo使ってないんだろう」
という疑問を持つ方がいるかもしれない。
このエントリは、そんな疑問を持った人に対する私なりの回答である。

sudoとは
sudoというのは、最近のLinuxディストリビューションではかなりデフォルト導入率の高い[1]、「他のユーザとしてコマンドを実行する」ためのコマンドである。
また、他のユーザとしてコマンドを実行する時に【自ユーザのパスワードをcredentialとして使用する】のも大きな特徴。

古くからUNIXでは、su(substitute user)というコマンドで、ターミナル上での実行ユーザの切り替えを行ってきたが、最近ではAndroidでroot権限が必要な場合にsuをインストールする手順があるので、こっち経由で知っている人も多いかもしれない。
sudoを使うと、sudo以降にタイプしたコマンドを、(suでユーザ変更することなく)自分以外のユーザで実行できるということである。

sudoが嫌いな理由
ここからは自分がsudoを使わずにsuを使う理由を並べていく。
  • 毎回sudoって打つのが面倒
使い勝手の面ではこれが最大の嫌いな理由である。例えば「あーaptで更新したいなー」と思った時に
$ sudo apt-get update
[sudo] password for hogehoge:
$ sudo apt-get upgrade
必要なステップは3つ。ただし事前に認証済みで、認証が残っていればパスワードは聞かれないので2つ。この2つだったり3つだったり感。
一方で、普通にsuして同じコマンドを実行する場合は
$ su -
パスワード:
# apt-get update
# apt-get upgrade
必要なステップは常に3つ(パスワード入力を1とするなら4つ)だが、コマンド打ってる途中にパスワードを入れるという混乱が起こらないのでこっちのがいいなぁ。

  • 一般ユーザのパスワードに他ユーザの履歴が混じって記録される
いまどきのインタラクティブシェルは大概コマンドの履歴を保持する機能を持っていて、すぼらなユーザが「あの時どんな引数使ったかなぁ」なんて時にhistoryコマンドで実行履歴を参照されるので、最近実行したコマンドは引数含めて確認が簡単にできる。
のはいいのだが、sudo使うとsudoコマンドの履歴も一般ユーザのhistoryに残るので、root権限の必要なコマンドが一般ユーザの履歴に残る。更に、【sudoは認証に自ユーザのパスワードを使うので、どんなに重要なコマンドであってもそのユーザが実行できてしまう】状態になる。個人的にはセキュリティ考えると一般ユーザでログインされた時点で全部クラックされたも同然なのでなんで問題にならないんだろうと前から思っているのだが。

sudoを使うメリット
では、sudoを使うメリットとは何なんだろうか。
  • 実行履歴をロギングできる
sudo自体は2通りのロギングの仕組みを持っている。syslogのファシリティを設定することでsyslogに渡す事もできるし、sudo自体のログ機構も使うことができる。特に大事な設定を変更する場合は監査目的で保持したほうが良い場合があるので、そういった場面ではコマンド履歴をロギングできるというのは非常に有用であると思う。[2]

なので、企業内でsudoを使うというのは妥当な理由があると思う。そもそもsudoを使わないとできない操作はchrootとか使えばいくらでも代替できるので、クリティカルなサーバでは存在しないのではないかとも思うが。

sudoを使うメリット?
sudoの使い方と合わせて合理的っぽい理由として書かれている利点に

  • ssh/telnetでrootログインされる心配がない
というのがあるが、これ本当だろうか。心配がないというのは本当なんだが、(インターネット経由での)telnet自体はもう使われないとしてsshログインに話を限定すると、

  • 大抵の場合、sshdはデフォルトでrootログインを許可していない(PermitRootLoginの設定)
  • 外部公開する場合、sshdは公開鍵認証にするのが普通なので、それが破れている時点でrootを破られてもsudoersされてる一般ユーザを破られても大して変わらないのではないか
  • sshdの脆弱性を突かれる可能性はあるが、opensshとsudoだとsudoの方がセキュリティパッチ当たる頻度が高いのでsudo使うほうが危なくないか

というのが個人的な意見である。

sudoじゃなくてsuでrootユーザになれるようにする
最近のLinuxディストリビューションでは、インストール時にも一般ユーザの設定しかしないし、実際にインストール後にsu -しようとしてもパスワードが一致しない。これは設定されていないrootのパスワードに合わせる方法が存在しないからである。ということで、rootのパスワードを設定することでsuからrootになれるようにするのが、インストール後最近一番最初にやることになっている。
でもどうやって?sudoを使って。

rootユーザのパスワードを設定するのはroot権限が必要。でもrootユーザのパスワードが設定されていないのでsu - rootができない。ならばsudoを使うしかない。
$ sudo passwd root
New UNIX password:
Retype new UNIX password:
んで、sudoグループに入っているとsudoが使えてしまう(sudoersの設定による)ので、sudoグループから抜ける。
まずはどのグループに入ってるか確認
$ id -a
uid=1000(hogehoge) gid=1000(hogehoge) groups=1000(hogehoge),27(sudo),111(fuse),122(kvm),123(libvirt)
rootになってusermod。
$ su - root
# usermod -G hogehoge,fuse,kvm,libvirt hogehoge
C-dで戻って
$ id -a
uid=1000(hogehoge) gid=1000(hogehoge) groups=1000(hogehoge),111(fuse),122(kvm),123(libvirt)
sudoできなくなったことを確認
$ sudo apt-get update
[sudo] password for hogehoge: 
hogehoge は sudoers ファイル内にありません。この事象は記録・報告されます。
以上。


[1] Ubuntuがデフォルトで使っていたからという理由が一番大きそうだが
[2] ちゃんと活用できれば、の話だが

2013-10-20

ibusではなくfcitxを使う

(2014/06/21更新)
このエントリの内容ですが今やると一部思い通りにならないので、新しくエントリ書きました。参考になれば幸いです。
LMDE UP8(MATE)での日本語入力にfcitxを使う

概要
ここ最近ではデスクトップLinux上の日本語入力にibusとmozc(Google日本語入力のオープンソースプロダクト)を組み合わせて使っていましたが、ibusの1.5に伴う仕様変更がどうもインパクトが超大きい[1]みたいなので、とりあえずibusの代替としてfcitxを使ってみます。環境はDebian GNU/Linuxのtesting(かつLMDE)。

手順
# apt-get install fcitx fcitx-mozc
(20140222更新  im-configがインストールされていない場合はim-configパッケージをインストールしておく。)
# im-config -c
20140222追加 # apt-get install  fcitx-config-gtk fcitx-config-gtk2 fcitx-frontend-gtk2 fcitx-frontend-gtk3 mozc-utils-gui

Xを抜けてログインし直す。
設定→Fcitx設定を選ぶ。
mozcがあるはず。
オンオフのキーに最初Ctrl+SpaceのUNIXでおなじみの組み合わせが指定されていますが、私の場合Eclipseの補完とかぶるので全角半角にしました(結果的に2つ全角半角を指定していることになっていますが)
mozcの設定はGNOMEタスクトレイのキーボードアイコンを右クリック→Mozcツール→設定ツールから。
元々設定した値がそのまま設定されていました。手順は以上。

参考サイト
Fcitxのテストのお願い - いくやの斬鉄日記 http://blog.goo.ne.jp/ikunya/e/a5c2a00e25564c61d322c4c73b7a81da
Debian -- sid の fcitx パッケージに関する詳細 http://packages.debian.org/ja/sid/fcitx

追記(2013/11/06)
Fcitxを使い始めて1週間ほど経つものの、万全ではない感は感じている。
というのは、一旦Fcitxが起動してMozcに切り替われば何の問題もないのだけど、結構な頻度で「Mozcって表示されるけど日本語入力ができない」状態に陥っていて、手元で試す限りでは原因も(確実な)回避策も見つかっていない。設定が関係している可能性もあるし。

このエントリの前半で記載したように、Fcitxへの切り替えに「半角/全角」キーを使っているのだけど、その時に「Mozc」と表示されるけど英字入力のままになってしまうけど、何回か試すとMozcで処理できるようになっている時があるので、そうなるまで「半角/全角」キーを何回も押して試すという残念な回避方法でしのいでいる。
一旦Mozcに移れば基本的には問題ないので、できるだけこれを保てるように、Mozcで英字を打っておいてF10キーで半角英数に変換するというこちらも残念なワークアラウンド。

追記(2013/11/17)
どうもターミナルから起動したアプリでFcitxが起動できなくて若干困り中。
気休めにQtでの設定をしてみる。
# apt-get install qt4-qtconfig
qtconfigで起動したQt設定ツールの「インターフェース」タブからデフォルトのインプットメソッドを「fcitx」に設定する。これでQtのアプリでもFcitxが使える・・・ようになるのかなぁ。

そいでもって、GTK側のアプリは環境変数GTK_IM_MODULEの値を見ているようで、自分とこの環境だと~/.bashrcに書いてあったので、他とまとめて

export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export QT_IM_MODULE=fcitx

と変更。

[1] キーボードの配列とIMが紐付けられてしまって変更できなくなった。英語配列のキーボードだとmozc使えないらしい。