考えていること
Ubuntu系のLinuxサーバを操作していてふと思うところがあった。
Linuxサーバが攻撃に耐えられなくなって、誰かに侵入された場合、Ubuntuだとroot権限を取られるまでに時間稼ぎはできないな。と。
一方、CentOSだと時間稼ぎできそうだな。と。「だからUbuntuはダメ」という話をしたいわけではない。
僕は日常的にUbuntu系のLinuxMintを使用していて、その便利さに感謝している。
CentOSとUbuntuのアカウント
CentOSなどでは、一般ユーザのアカウントAでアクセスし、root権限が必要な作業をしなければいけない時には、sudoコマンドやsuコマンドを使用するというのが普通だ。この時、sudoコマンドはできることが限定されていて何でもできるわけではない。suコマンドを使うときには、アカウントAとは別のrootのパスワードが必要になってくる。つまり2組のIDとパスワードが必要になるということだ。
もっとも、rootというIDは全世界が知っているので、わからないのは1組のIDパスワードとrootのパスワードということになる。
Ubuntuなどでは、インストール時に設定する初期ユーザがsudoコマンドで何でもできるようになっている。root権限で何かするときには、sudoコマンドで”自分のパスワード”をいれることになる。
1組のIDパスワードだと何が気になるのか
UbuntuでもCentOSでも、IPアドレスやポート番号でフィルタリングしたり、802.11x認証や公開鍵認証方式でSSHできるようにする等、アクセス制限をガチガチにかためることはできるのだが、**「それでも侵入されてしまうことはある。」**という考え方に基づいて対策は練っておく必要があるんだろう。
侵入されてしまったときに、はじめからroot権限をとられてしまうような場合はどうしようもないとして、一般ユーザの権限をとられてからroot権限に昇格されてしまうまでに時間がかかれば、対応が打てる可能性もある。
この時、1組のIDパスワードでなんでもできるようになっていると、すでに侵入されてしまったわけだから、root権限も奪取されたと同じことになるのではないか?と考えた。これが2組のIDパスワードを奪取しなければroot権限を取得できないとすれば、一般ユーザからrootになるまで、時間稼ぎができる。
他のネットワーク機器は?
他のスイッチ、ルータ、Firewallなんかを見ると、configを変更できたり、リブートやシャットダウンするために、1組のIDパスワードでできるものと2組以上のIDパスワード入れなければできないものがある。
2つのパスワードが必要なものの代表としては、多くのところで使用されているCiscoのスイッチやルータがある。1組のIDパスワードの代表としては、多くのブロードバンドルータ・Wifiルータが挙げられる。ブロードバンドルータやWifiルータはWebGUIを備えているものが多く、IDがadminでパスワードは任意に変えられるというものが多かったりする。他にもFirewallでWebGUIで設定するようなものは1組のIDパスワードとして考えられる。
ちょっと古い話になるけど、IOT機器がミライなどの感染するマルウェアに乗っ取られてしまうのは、IDとパスワードが1組だからだと思う。
Ubuntuはどうしたら良いのか?
Ubuntuで管理者権限で重要な作業をする場合、インストール時に登録したユーザで作業することが多いのではないだろうか?もしくは、個人アカウントを設定してあって、普段は個人アカウント、root権限を必要とするときには、特権ユーザアカウントでログインしなおしたり、sudoコマンドで特権ユーザになったりするわけだけど、sudoコマンドを使うときにはやっぱり自分のパスワードを使うことになる。
この辺の運用の仕方が一般的にどうやっているのかよくわからないのだけれど、少なくともインストール時に登録したアカウントで作業し続けることはあまり良くないような気がしている。それはIDはわからないものの、rootで作業しているのと同等なんじゃなかと思っている。
Ubuntuサーバでアカウント数が増えてくると、一発で乗っ取られてしまうことは確率的に減ってくるけど、一般ユーザで閲覧できる/etc/passwdファイルを見れば、一番最初に登録されたアカウントは何なのかすぐにわかってしまう。後で修正を加えてアカウントの順番を変えれば少しは時間稼ぎになるかもしれない。
sudoについて少し調べたら光が見えてきた
sudoを使うときには”自分のパスワード”を入れるわけだが、少し調べてみたら、これは絶対ではないことがわかった。あくまでデフォルトが"自分のパスワード”になっているだけで、別のパスワードに変更することができるようだ。
やり方
まず、Ubuntuのrootにパスワードを付けておく。
$ sudo su -
で、1度rootになり、passwordコマンドを使用してrootのパスワードを設定しておく。
次に、sudoコマンドを実行した時にrootのパスワードを聞いてくるようにする。
$ sudo visudo
を使用して/etc/sudoersファイルに追加の設定を入れる。
Defaults rootpw
ちなみに、特定のユーザのパスワードを使用するときは(下記の場合はtestというユーザのパスワードを使用するとき)
Defaults runaspw,runas_default=test
特定のユーザのパスワードを使用するとき。例えば、hogeユーザだったら/root/text.txtファイルを編集できるとした場合
$ sudo -u hoge vi /root/test.txt
という感じで入力できるようにする場合は、以下のように追加する。
Defaults targetpw
そもそもubuntuはrootパスワードを設定せず、一般ユーザがrootパスワードを知らなくても良いように作られているのだが、あえてrootパスワードを設定したり、root権限を持ったユーザを作っておき、一般ユーザにはsudoで適切な権限を与えることで、2つのパスワードを使い分けることができ、時間稼ぎができるようになる。
他のネットワーク機器はというと…
しかし、ブロードバンドルータなどの1組のIDパスワードで守られているネットワーク機器が乗っ取られた場合、時間稼ぎをして管理者権限を守ることは難しそうだ。この場合は、侵入されたら終わりと考えたほうが良く、すぐに切り離しをして、他の機器への影響を最小限にする対策が求められそうだ。
残念なことに、sudoコマンドを調べていたら、**「sudoでパスワードを聞かれないようにする方法」**というようなサイトを多数見ることができた。それなら何もubuntuなど使わず、CentOSでもなんでも、rootになって作業をすればよいのではないかと思うのだが……。