Linuxは企業のサーバとして利用されることが多い。
そのため、Linuxのセキュリティ対策はとても重要なポイントだ。
このページではLinuxのセキュリティの基礎対策について概要をご紹介する。全体像をざっくりと把握するにはちょうど良い内容になっているだろう。参考にして頂ければと思う。
目次
Linuxのセキュリティ対策
オープンソースとセキュリティについて
オープンソースで大丈夫?
Linuxはオープンソースで開発されている。つまりソースコードが公開されている訳だ。
「ソースが公開されているなら、悪意のあるユーザが弱点を見つけられるのでは?」
という疑問はもっともだ。実際、誰かが脆弱性を見つけて、それを報告しなければ、その人しか知らない脆弱性が残るということになる。
また、多くの人があらゆる要求に対して、多数の機能を追加することがあるため、ソースコードがどんどん膨らんでいく。そうなると、多機能になった分ソースコードが複雑になりセキュリティホールが生まれやすくなる。
このように問題もあるのも、事実だ。
集合知と善意で成り立っている
一方で、オープンソースプログラムは基本的に品質が高く安全であるという話も多い。
世界中の技術者がソースコードを閲覧し、良いものへと改良をつづけているからだ。ソースコードが公開されているため、悪意のあるコードは直ぐさま削除される。
また、そもそもレビューの段階で弾かれる。優良なソフトウェアであれば、優秀なエンジニア陣がレビューを行い、追加するコードを厳密に判定している。
問題は確かにあるがそれを抱えながらも、世界のエンジニアの手によりよい方向へ進歩しつづけている。これは現在ソフトウェア開発に対して「善意」が働いている証である。現在オープンソースの開発とそのセキュリティは一定の成功を収めているといえるだろう。
しかしやはり「絶対安心」である保証はないので気をつける必要はある。まずはそれを認識しておこう。
また、CentOSなどは、商用のOSを元に作っているため、企業側が重点的に確認をし、安全性も高くなっている。詳しくは下記ページから。
Linuxとroot権限について
Linuxにはrootという絶対権限をもったユーザが存在する。root権限でのオペレーションはほぼ全て絶対である。自分で自分のシステムを削除することもできる。
よって悪意あるユーザから「絶対に守らなければならない権限」だ。root権限を取られたら、一発KOになる。
root権限が取られてしまったら?
root権限を奪われた場合システムをインストールし直さなければならない。そのシステムは全く信用出来なくなるからだ。
これを問題視する声もある。そこで「root権限をなるべくつかわない」「root権限に制約を持たせる」という方法でその問題に対処することになる。
sudoを使おう
「root権限をなるべくつかわない」これは「sudo」を使えばいい。
一般ユーザに一時的にroot権限を貸し出す形だ。
誰にどのコマンドでroot権限を貸しだすのか、細かく設定することが可能なので、安全性が高くなる。またそのユーザのパスワードでコマンドを実行できるため、rootパスワードを知られることはない。suで全権をゆだねるよりも安全だ。
root権限に制約を持たせる
もうひとつの選択として「root権限に制約を持たせる」というアプローチがある。
RHELやCentOSは強制アクセス制御を「SELinux」で実現している。これは「rootであってもアクセス制限を適応する」というものだ、これにより、より細かいファイルアクセス制御が実現される。しかしこれは事後対策的だ。
sudoを使って、root権限をあまり使わないというのがセキュリティにおいて大切になる。
ディストリビューションとセキュリティについて
Linuxのディストリビューションによってはマンパワーや資金面で差が出てしまうのも事実である。サーバとして運用する場合、マンパワーや資金面で余裕のあるディストリビューションを選択する必要があるだろう。
この場合RHELやCentOS、debianやUbuntuといったディストリビューションがあがるだろう。
これら4つは資金やマンパワーが非常に強い、セキュリティホールなどが見付かった場合も約48時間以内になにかしらの対策がなされる。これは非常に心強い。
また出来るのならばメーリングリストに登録しコミュニティに実際に参加して、パッチを書き提出するのがベストだろう。オススメのディストリビューションについては下記でも詳しく説明している。
SUIDと SGIDについて
このページを読んでいる方ならご存知だとは思うが、Linuxにはパーミッションという概念がある。
ファイル一つ一つにアクセス制限をかけることができる。このパーミッションのなかに特殊な属性が存在する。SUIDと SGIDだ。
SUIDはset user id の略だ。どのユーザがそのファイルを実行しても、ファイル所有者の権限で実行される。
SGIDはset group id の略だ。どのユーザがそのファイルを実行しても、ファイルグループの権限で実行される。
SUIDやSGIDが設定されているファイルは攻撃の対象になりやすい。または何らかの攻撃にSUIDやSGIDを使われることもある。
そのため、これらを使う場合には、定期的に確認がしたい。
find / -perm -4000 -o -perm -2000
などで一覧が表示できる。
これらの一覧を作っておき、定期的に結果を比較することで、システムの改ざんなどを検知できる。
ソフトウェアのアップデートは頻繁に
多くのLinuxディストリビューションはインストールされたソフトウェアを管理しアップデートする手段を提供している。RedHat系ならyumもしくはdnf、Debian系ならばaptなどだ。
ソフトウェアのアップデートに関して気をつけるべき点は2点だ。
- 情報を追いかけて、しっかりアップデートをかけるようにしよう
- 脆弱性が見つかったら、コミュニティに連絡しよう
ソフトウェアのコミュニティが管理しているソースコードは注意をはらって作成されるが、単純なミスでセキュリティホールが生まれてしまう。
例えばバッファの大きさのチェックを忘れると、いとも簡単にバッファオーバーフローが発生する。
バッファオーバーフローとはプログラムで用意されているバッファを超えるデータが来たときに、データが溢れてしまい、起こる脆弱性だと思っていただきたい。
バッファオーバーフローについては下記のページが詳しい。
他、制御分のifなどで条件に漏れがあった場合も同じようなことがおこりえる。
上記の二つは最も初歩的だが実際にあることだ。
これらによりメモリに不正書き込みを行い任意のコードを実行、権限の昇格、などが起こる。
これらはバグとしてコミュニティに提出されコミュニティが対応をとることになる。直せるなら直してもいいが、なかなか難しいだろう。
それらの各コミュニティがバグを修正しリリースしたものはディストリビュータがパッケージングしてアップデートとして提供される。もしくはディストリビューション内で独自に修正パッチが作成されることもある。RHELやDebianなど大規模ディストリビューションなどは大体が48時間以内になにかしらの対応策がとられる。
ユーザは提供されたパッケージを迅速にアップデートする。もしくは回避手段があるのならばそれを実行する。
システムログをチェックしよう
古いディストリビューションのログはsyslogまたはrsyslogなどで/var/log/*におさめられる。
tail -f <ログファイル>
などでリアルタイムにログの様子を確認することができる。SystemDを搭載した最近のディストリビューションの場合/var/log/journalのしたに専用のログが残る、中を確認するにはjournalctlコマンドを使用するjournalctlコマンドでログを確認することになる
journalctl -u <ユニット名>
でログを確認できる。
journalctl -f
でリアルタイムにログを確認できる。
何かセキュリティ的な問題が起こったときには、必ずログを見よう。解決策が見つかることが多い。
アンチウィルスソフトを入れる
LinuxにもWindows程ではないがアンチウィルスソフトが存在する。しかしLinuxをクライアントとして使う場合、アンチウィルスソフトは限られてくる。
一番有名なものを上げるとclamavになるだろう。しかし検出率はお世辞にも高いとはいえないが、それでも入れないよりはいい。
なぜLinuxクライアントに対してアンチウィルスソフトが少ないのかというと、端的にいえばデスクトップ端末へのシェア率の低さである。デスクトップのシェア率は実に95%ほどがWindowsでありLinuxは2%に届くがどうかという状態だ。悪意をもったユーザはクライアントをねらうならWindowsをねらった方が効率的なのである。
またOSの成り立ちも関係している。
LinuxはUnixを参考にして作られた。マルチユーザーが当たり前で、ユーザごとに適切に権限を振り分け、ユーザが悪意をもった行動をしようとしても「やりにくい」環境を作るのが基本だったのだ。
対してWindowsはパーソナルコンピュータのOSであり、所有者である目の前のユーザ以外が操作することをあまり念頭に置いていない。
こういった違いがセキュリティ面で大きく影響している。後述するがLinuxに「マルウェアの類が存在しないのか」と言えばそれは「そうではない」ここでは幾つかアンチウィルスソフトをあげておこう。
おもにサーバ用のビジネスソリューションであることが多い。
Clamav
開発形態:オープンソース
オープンソースセキュリティスキャナの代表的存在といえる。サーバサイドでのメールスキャンなどでよく使われている。
Trendmicro
開発形態:クローズ
http://www.trendmicro.co.jp/jp/business/products/splx/
Symantec
開発形態:クローズ
https://www.symantec.com/ja/jp/endpoint-protection/
Macafee
開発形態:クローズ
http://www.mcafee.com/jp/products/complete-endpoint-protection-business.aspx
ソフトウェアの稼働状況確認
まずサーバの場合は最小限のパッケージしか導入してはいけない。
インストール時には最小限インストールを選択する。これはパッケージ数を最小限におさえることで根本的にセキュリティホールの数が減らせるからだ。
また特殊な事情がないかぎり開発環境は入れてはいけない。その場でバックドアを作成される可能性があるからだ。他、稼動しているサービスも最小限に抑える必要がある。サーバを設定したあとはnmapなどで余分なポートが開いていないか確認することを心がけるよう。
サービスの状態確認
サービスが起動されるかを確認したい場合古いRedhat系の場合は
chkconfig –list
比較的新しい環境の場合SystemDが搭載されている。
systemctl list-unit-files --type=service
とタイプするとサービス起動設定を確認できる。
サービスを個々に起動、停止、再起動する場合
旧式のRedhatの場合
service <servicename> [stop,start,restart]
である。
比較的新しい環境の場合SystemDが搭載されているその場合
systemctl [stop,start,restart ] <servicename>
プロセスの確認
またどのようなプロセスが存在するか確認したい時はps auxコマンドで確認できる。ほかtopを使うと、プロセスの他マシン全体のアップタイムやロードアベレージなどが表示される。
ユーザが気をつけるべき事
これはWindowsもLinuxもサーバもクライアントも関係なくいえることだ。
- パスワードは10桁以上英数字、記号、小文字、大文字を含めること
- パスワードは決して使いまわさない
- 権限の割り当ては最小限にする。
- ファイルを共有する場合細心の注意を払うこと
- 添付ファイルは身元が明らかではない場合開かないこと
とても基本的なことだが、気をつけていても「うっかり」はありえるのである。コンピュータを前にしたら、これらを思いだすことを意識してほしい。
最悪なにが起るのか?
Linuxがクラックされた場合最悪root権限が奪取される可能性がある。
root権限があればLinuxは何でも言う事をきいてしまう。Webサーバであればページ改竄を始め、不正ファイルを設置ダウンロードさせることでウィルスなどの感染拡大など、メールサーバであればメールの不正転送など全て思いのままだ。
root権限奪取はシステムを乗っ取る目的のクラッカーの最終的なゴール地点だ。また一度侵入されたサーバはバックドアが仕掛けられている可能性がある。バックドアは乗っ取ったサーバへの裏口であり次回からバックドアを使い自由に出入りするためのものだ。これは管理者に気がつかないように仕込まれる。
最近ではWebページを動的に生成することが多い。
その関係上Perl、Python、PHPなどの高級なスクリプト言語が導入されていることがほとんどだ。侵入した後これらを使いその場でバックドアを即興で作成することができる。もしくは悪意あるスクリプトを作成し閲覧者に被害を与える事ができる。
企業のサーバだった場合当然、信用に関わる。リッチなコンテンツをつくる場合この事実を忘れないようにしておきたい。
物理構成に対するセキュリティ
ネットワークを構築する場合ファイアウォールの位置はネットワークの間におかれる。ファイアウォールを構築し公開する場合ネットワークアダプタを3つ構え、WAN,LAN,DMZとする場合が多いだろう。
WAN----FW----LAN
|
|
DMZ
小規模なネットワークの場合はこの構成が多いだろう。DMZとは”demilitarized zone”のことで直訳すると「非武装地帯」となる。ここに各種サーバが設置される、が当然サーバは要塞化すべきである。定義としては
「WANからは参照できるがLANには干渉できない空間」
のことを指す。大規模なネットワークな場合WAN側とLAN側それぞれにファイアウォールを設置することが多いだろう、こうすることでファイアウォールの負荷分散と役割分担しより強固なネットワークを構築できる。
WAN----FW----DMZ----FW----LAN
コンソールの横取り
信頼できない人をコンソールの画面前に連れてきてはいけない。またそのような状態を作ってはいけない。この場合、信頼できない人とは「管理者以外全員」だ。
なぜか? 問答無用であなたのコンピュータの電源ボタンを5秒間押し、システムをダウンさせた後再起動、シングルユーザモードで起動されるかもしれないからだ。
一部のLinuxディストリビューションではシングルユーザモードで起動すると、ユーザ認証をおこなわずrootでログインできてしまう場合がある。その場合passwdコマンドを叩くだけでrootパスワードを変更できてしまう。
また例えシステムを停止していて、ブートローダにパスワードを掛けていても同じだ。もしかすると悪意を持ったユーザがLiveDVDなディストリビューションを用意して、自己環境を起動し、そこからあなたのシステム領域をマウント、chrootしpasswdコマンドでrootパスワードを書き換えるかもしれないからだ。
またクライアントマシンを使っているときも、離席するときは必ずスクリーンをロックすること、あなたが居ないすきを狙い、あなたのコンピュータで悪意ある行動をするかもしれないからだ。
ネットワークからの侵入
Linuxにもマルウェアの類は存在する。
主に「トロイの木馬」が多い。トロイの木馬は基本的には増殖機能をもたないが、主にスパイウェアとしての活動が多い。情報をユーザが意図しないサーバへ転送したり、バックドアとして稼動する、作りこまれたものはリモートから機能増築まで可能になっている。
これらトロイの木馬はユーザの少しのミスで入りこんでくる。経路はメール、IRC、FTP、NFS、脆弱性の悪用などだ。コンピュータはユーザが許可した動作に対しては拒むことが出来ない、トロイの木馬に感染しないためには、日常的にファイルの扱いに注意をはらうことを意識しなければならない。
またサーバ運用している場合悪意をもったユーザはそのネットワーク構成をしる為にping スイープなどの手段でそのネットワークに何台のホストが存在し、ポートスキャンなどを行い、そのホストがどの様なサービスを提供しているかを探ろうとする。
そしてサービスを提供しているサーバアプリケーションに利用できる脆弱性がないか探すのである、悪意あるユーザは下準備を行なうのでその兆候を掴むことができれば対策も幾分楽になる。
サーバはその性質上外部から常になにかしらのアクセスを許容しているので、そういった行為にさらされることになる。
そして悪意あるユーザは少しでも楽にサーバを乗っ取りたいのである、そのため少しでもセキュリティレベルを高く保ち、その成果が実れば、おそらく悪意あるユーザはターゲットをかえるかもしれない。
そのためにまずiptablesについて学ぶと良いだろう。こちらを参考にすると手掛かりがあるはずだ。
情報源
最後に、簡単ながらセキュリティの脆弱性についての情報が集まるサイトに関して紹介する。
各種メーリングリスト
自分のつかっているディストリビューションのメーリングリストは参加しておいた方がよいだろう。
各種バグトラッキングシステム
メーリングリストと同じくバグトラッキングシステムも用意されているはずだ。バグトラッキングシステムはバグ情報を共有する専用の掲示板システムのことだ。
CVE
「Common Vulnerabilities and Exposures」直訳すると共通脆弱性識別子である。脆弱性に識別子を振り当て管理している。あらゆる脆弱性情報が多くあつまっている。
NVD
CVEで発見された脆弱性の詳細を掲載しているサイトである。ほぼCVEと組み合わせて一つの存在としてみていい。
JVN
"Japan Vulnerability Notes"
脆弱性対策情報ポータルサイトであるCVEの管理団体が米国であるために日本での脆弱性情報が網羅されているわけではなく、それを補完する形で登場した組織である。
これらサイトの各項目
AV 攻撃元区分 (Access Vector)
脆弱性のあるシステムをどこから攻撃可能であるかを示す。
L = ローカル, A = 近隣のネットワーク, N = ネットワーク
AC 攻撃条件の複雑さ (Access Complexity)
脆弱性のあるシステムを攻撃する際に必要な条件の複雑さを示す。
H = 高, M = 中, L = 低
Au 攻撃前の認証要否 (Authentication)
脆弱性を攻撃するために対象システムの認証が必要であるかどうかを示す。
N= 不要, S= 単一の認証, M= 複数の認
C 機密性への影響 (情報漏えいの可能性、 Confidentiality Impact )
脆弱性を攻撃された際に、対象システム内の機密情報が漏えいする可能性を示す。
N = 無し, P = 部分的, C = 完全
I 完全性への影響 (情報改ざんの可能性、 Integrity Impact )
脆弱性を攻撃された際に、対象システム内の情報が改ざんされる可能性を示す。
N = 無し, P = 部分的, C = 完全
A 可用性への影響 (業務停止の可能性、 Availability Impact )
脆弱性を攻撃された際に、対象システム内の業務が遅延・停止する可能性を示す。
N = 無し, P = 部分的, C = 完全
評価の仕方に違いがあるが上記を知っていると役にたつだろう。
まとめ
Linuxセキュリティに関する基礎知識をまとめてきたが、いかがだっただろうか?
セキュリティに関しては様々考えるべきことがあるし、分野も豊富だ。まずはざっくりとした全体像を把握して、自身のサーバにとって必要な対策を取っていこう。
コメント