2014/11/22

5.ログの改ざん防止

chattrで侵入者の証拠隠滅を防止する

 コンピュータが不正アクセスを受けた場合、コンピュータの中には攻撃者によって残された様々な痕跡が存在します。
侵入された証拠を記録しているこれらのログは、必ず守る必要があります。
正確で信用できるログが残っていなければ、攻撃者の侵入経路やその手法を解析することができません。

攻撃者が残した痕跡の数々はインシデントの分析を行ううえで非常に重要な情報です。
しかし攻撃者よってroot権限まで奪われてしまった場合に、それらの痕跡が消されることを防ぐことはできるでしょうか?

 多くのOSでは、ファイルの属性に作成日や更新日が保存されます。
またLinuxとBSD系OSでは、ファイルとディレクトリに拡張属性を割り当てることが可能です。
拡張属性は、すべてのユーザーに適用される点やパーミッションやアクセスコントロール[Hack #4]に優先するという点において従来のUnixのパーミッション管理と異なります。
Linuxではファイルの属性を確認するlsattrコマンドや、変更するchattrコマンドが用意されています。
BSD系のOSでは属性の確認にls -loを、変更にはchflagsを使います。

 ログファイルの保護に便利な属性として「追加のみ許可」があります。
この属性が設定されているファイルにはデータを追加できるだけで、削除することが許されません。
Linuxで、ファイルに「追加のみ許可」属性を設定するには以下のようにコマンドを実行します。
# chattr +a filename
 またBSDでは以下のようにコマンドを実行します。
# chflags sappnd filename
 以下のコマンドを実行し、「追加のみ許可」属性を設定したファイルがどうなるかを確認してみましょう。
# touch /var/log/logfile
# echo "append-only not set" > /var/log/logfile
# chattr +a /var/log/logfile
# echo "append-only set" > /var/log/logfile
sh: /var/log/logfile: Operation not permitted  「追加のみ許可」属性を設定したファイルの上書きは失敗しています。
この状態でも以下のようにファイルへの追記は可能です。
# echo "appending to file" >> /var/log/logfile # cat /var/log/logfile append-only not set appending to file
root権限を奪った攻撃者であれば、このファイルから痕跡を消そうとするため、 chattr -aコマンドを使用して、属性を変更しようとするかもしれません。
これを防ぐために「追加のみ許可」属性の削除を許さないよう設定することも可能です。
Linuxではカーネルの「capability」機能を使用し、BSD系のOSでは「securelevel」機能を使 用します。

Linuxのcapabilityを用いると、rootアカウントの強大な権限を制限することができ ます。
例えばファイルに設定されている「追加のみ許可」属性の変更を禁止するには、 capabilityの設定からCAP_LINUX_IMMUTABLEを削除します。

capabilityの 設 定 を変 更 するには、lcap(http://snort-wireless.org/other/lcap- 0.0.6.tar.bz2)ユーティリティを使用するとよいでしょう。
lcapのソースアーカイブを入手し、以下のようにコンパイルしてください。

# tar xvfj lcap-0.0.6.tar.bz2 && cd lcap-0.0.6 && make  「追加のみ許可」属性の変更を禁止するには、以下の例に従ってlcapを実行します。
# ./lcap CAP_LINUX_IMMUTABLE # ./lcap CAP_SYS_RAWIO
 最初の実行例では「追加のみ許可」属性を変更するcapabilityを禁止してい ます。
次の実行例ではraw I/Oを使用するcapabilityを禁止しています。
この場合、ファイルシステムに直接アクセスしてファイルを変更することを防ぐと同時に CAP_LINUX_IMMUTABLEの制限を迂回できる/dev/memや/dev/kmemへのアクセスも禁止します。

 ブート時にこれらの制限を適用するには、/etc/rc.localといったスタートアップスク リプトにこれらのコマンドを記述します。
このコマンドはスタートアップスクリプトの末尾に記述するとよいでしょう。
これはスタートアップスクリプトの処理そのものが、capabilityによって影響されることを防ぐためです。
一度lcapによって禁止されたcapabilityは、システムをリブートしないかぎり元に戻すことはできません。

BSD系のOSではsecurelevelを使用して同様のことを実現します。
securelevelとは特定の機能を制限できるカーネル変数です。
securelevelを1に設定すると前に説明したLinuxの2つのcapabilityを設定した状態と同じ効果が得られます。
いったんsecurelevelに0以上を設定すると、通常のリブートではsecurelevelを下げることができません。

securelevelのデフォルト値はBSD系OSの種類によって異なり、マルチユーザーモードのOpenBSDは1で、FreeBSDは-1が設定されています†。
 セキュリティレベルを変更するには、/etc/sysctl.confに次の行を追加します††。
kern.securelevel=1  ログファイルに「追加のみ許可」属性を設定するとログローテーションスクリプトが失 敗してしまいますが、これによってログの完全性を飛躍的に高め、インシデントの際に 貴重な情報をもたらします。

2014/11/19

3.書込みパーミッション設定が甘いディレクトリの捜索

パーミッション設定が甘いディレクトリを簡単に発見する

ディレクトリの書き込み権限を適切に設定することは、セキュリティを確保するうえで非常に重要です。 各ユーザーのumaskが適切に設定されていない場合、気づかない うちに低いセキュリティのファイルやディレクトリを作成してしまいます。これを防止す るために、普段からパーミッションの甘いディレクトリがないか検査するようにしましょ う。その方法は、「SUIDおよびSGIDプログラムの調査」[Hack #2]で紹介した方法と同様 に、findコマンドを利用して行います。
# find / -type d \( -perm -g+w -o -perm -o+w \) -exec ls -lad {} \;
 このコマンドを実行すると他のユーザーやグループに書き込み権限を与えているディ レクトリがリストアップされます。これらのディレクトリにはstickyビットを設定すべき です。stickyビットが設定されていると、ls -lコマンドの出力のファイル属性にtの 文字が表示されます。stickyビットが設定されたディレクトリ内のファイルについては、 そのディレクトリの所有者、ファイルの所有者、rootにのみ書き込みや変更の権限が与 えられます。  また、stickyビットが設定されてないディレクトリは、以下のコマンドを実行すること で探し出します。
# find / -type d \( -perm -g+w -o -perm -o+w \) \ -not -perm -a+t -exec ls -lad {} \;
 ユーザー名と同名のクループ名のグループに属している(例えば、andrewというユー ザーがandrewというグループに属している)場合にはセキュリティ上の問題にはなり ませんので、グループのユーザーに書き込み権限を与えたディレクトリを探す必要はあ りません(さもないと、実行結果にセキュリティ上問題のないディレクトリが混ざってし まいます)。その場合はコマンドの-perm -g+wを削除して実行しましょう。

2014/11/12

21.システムアップデートの自動化

迅速なセキュリティパッチ適用により侵入を防止する

 セキュリティホールを悪用した攻撃からシステムを守るためには、ソフトウェアのアッ プデートやパッチ適用をこまめに実施してシステムを最新の状態に保つことが重要で す。あいにく、パフォーマンスチューニングやハードウェアメンテナンス、あるいはソ フトウェアのデバッグのような「より緊急の」作業が優先されるため、システムのアップ デートやパッチ適用といった作業は後回しにされがちです。パッチを適用することで、 システムの基本機能が向上するわけではありません。時間と費用の無駄とみなされ、低 コストで最大のパフォーマンスを求める経営者の下では、システムのアップデートはた いてい作業リストの最下層に追いやられてしまいます。  スクリプトなどを使った自動化をしていないのであれば、手作業によるアップデート は非常に時間のかかる繰り返し作業です。ありがたいことに、たいていのLinuxディス トリビューションはアップデートのためのパッケージをネットワークからダウンロードで きます。アップデートを自動化するにはパッケージの有無や変更をモニターし、自動的 に判定してダウンロードしてアップデートするツールを作成すればよいでしょう。その ようなツールにAutoRPM(http://www.autorpm.org/)があります。このツールを利用 するとパッケージの配布サイトをチェックして、新しいパッケージをダウンロードする作 業を自動化できます。 AutoRPMは複数のFTPサイトをチェックして新しいパッケージを探すことができる Perlスクリプトです。AutoRPMには、新しいパッケージあるいは変更されたパッケー ジを自動的にダウンロードして管理者に通知したり、自動的にインストールしたりする 機能があります。さらに、1つのFTPサイトだけを利用できるのではなく、そのFTP サイトが利用できない時に代わりになるミラーサイトを複数登録することもできます。 AutoRPMは混んでいるFTPサイトをモニターし、これまで何度そのサイトと通信を試 みたか記憶します。これにより、登録されているFTPサイトをスコアリングし、スコア が最も高いFTPサイトからチェックしていきます。 AutoRPMを使うためには、最新のパッケージをダウンロードして次のコマンドにより インストールします。
# rpm -ivh autorpm-3.3.3-1.noarch.rpm
 ソースコードからインストールすることも可能です。ただし、Makefileは用意されて おらず、自分の手でファイルをコピーするしか手はありません。とても面倒なのでRPM パッケージの使用をお勧めします。 AutoRPMのデフォルト設定はRed Hat Linux用ですが、以下のようにAutoRPMの 設定ファイル/etc/autorpm.d/autorpm.confを変更することでFedoraや他のRPMベー スのディストリビューションでも利用することができます。
###################### BEGIN Red Hat Linux ############################## # This automatically determines the version of Red Hat Linux # You have... you can comment this out and define it yourself # if you want to Eval_Var("RHVersion", "sed 's/\(Red Hat Linux \)\?release \([^ ]*\) (.*)/\2/' /etc/redhat-release"); #Set_Var("RHVersion", "9.0"); # Look for official Red Hat updates # (won't automatically install anything unless you edit the file) Config_File("/etc/autorpm.d/redhat-updates.conf"); ######################## END Red Hat Linux ##############################
 まずEval_var、Set_var、Config_Fileの行をコメントアウトします。そして続 くセクションのEval_val、Config_File行を以下のように変更します。
###################### BEGIN Fedora Linux ############################### # This automatically determines your version of Fedora Linux Eval_Var("FedoraVersion", "rpm -q fedora-release | awk -F'-' {'print $3'}"); # Look for official Fedora updates # (won't automatically install anything unless you edit the file) Config_File("/etc/autorpm.d/fedora-updates.conf"); ######################## END Fedora Linux ###############################
 変更が終了したなら、crontabで/etc/autorpm.d/autorpm.cronスクリプトが定期的 に実行されるよう登録します。これにより、定期的にアップデートパッケージを自動的 にダウンロードします†。 AutoRPMではなく、yumを使って自動的にアップデートを行う方法もありま す。デフォルトでyumはアップデートのダウンロードとインストールを行いますが、 downloadonlyプラグイン(http://linux.duke.edu/projects/yum/download/yum-utils/) をインストールすることで、yumがインストールステップをスキップできるようになり ます。  これで以下のコマンドを実行することにより、すべてのアップデートパッケージをダ ウンロードすることができます。
# yum --downloadonly -y update
このコマンドをcrontabに登録することで、定期的にアップデートパッケージのダウ ンロードが自動で実行されます。そしてダウンロードしたアップデートパッケージを確 認して、yum updateコマンドを実行することで、それらをインストールできます。 Debianベースのシステムであれば、apt-get -d -y upgradeコマンドを実行す ることで、似たような結果を得ることができます。このコマンドはすでにインストール してあるパッケージのアップデートパッケージをダウンロードします。そしてapt-get upgradeを実行することでそれらのアップデートパッケージをインストールできます。  これまで見てきたように、システムを最新の状態に保つための方法はいくつか存在し ます。オペレーティングシステムを最新の状態に保つことは、それらが抱えるセキュリ ティ上の問題を修正するためにも大切な作業です。セキュリティホールを抱えたままの システムは、攻撃者にとって格好の餌食となります。

2.SUIDおよびSGIDプログラムの調査

root権限で動作するプログラムやバックドアを素早く発見する

システム内で悪意を持ったユーザーがroot権限を獲得する方法の1つとして、脆弱性 のあるSUID、SGIDの与えられたプログラムに対する攻撃があります。例えばSUID、 SGIDの与えられたプログラムとしてpasswdコマンドがあります。一般ユーザーがパ スワードを変更するためには、rootによって所有されるパスワードファイルを変更する 必要があるため、passwdコマンドをroot権限で実行させる必要があります。そのため passwdプログラムには、ファイルの所有者の権限で動作させるためのSUIDビットが設定されています。 同様にSGIDビットが設定されている場合は、そのファイルのグループ権限で動作します。 ls -lを実行することで以下のようにSUIDビットが設定されているかどうかを確認することができます。
-r-s--x--x 1 root root 16336 Feb 13 2003 /usr/bin/passwd
 所有者の実行ビット(x)の代わりに、stickyビット(s)が設定されていることに注意 してください。これはSUIDビットが設定されているファイルであることを意味していま す。  困ったことに不完全にコーディングされたSUIDあるいはSGIDビットを持つプログ ラムの存在は、ユーザーに対してより高い権限を得るチャンスを与えてしまいます。ま た、すでにroot権限を入手した攻撃者がバックドアとしてSUIDビットを与えた実行 ファイルを紛れ込ませる可能性があります。これらを発見するために、システム上の SUIDやSGIDビットを持ったファイルを調査する必要があります。これは以下のように 簡単に実行することができます。
# find / \( -perm -4000 -o -perm -2000 \) -type f -exec ls -la {} \;
 ただし実際のところ、SUIDビットの脅威はシェルスクリプトである場合が多く、それ らを利用したバックドアは何気ないファイルを装っているでしょう。またほとんどのOS はシェルスクリプトに設定されたSUIDやSGIDビットを無視します。  もしもシステム上のSUIDやSGIDビットが設定されたスクリプトを発見するのであ れば、以下のように-execオプションを変更し、ELF(実行型バイナリ)ファイルを除 外するためコマンドを、パイプ(|)と共に追加します。
# find / \( -perm -4000 -o -perm -2000 \) -type f -exec file {} \; | grep -v ELF
 また上記の例とは逆に実行型バイナリを表示させるなら以下のようにコマンドを実行します。
# find / \( -perm -4000 -o -perm -2000 \) -type f -exec file {} \; | grep ELF
 ほとんどのOSはELF形式の実行ファイルですが、そうでない場合はgrepコマンド のELFオプションの部分を、稼動中のOSやアーキテクチャで使われているバイナリ フォーマットに応じて書き換えます。例えば、古いバージョンのLinuxはa.out、AIXは XCOFFを使用しています。 findコマンドでSUIDやSGIDビットが設定されたファイルを見つけたなら、続けて fileコマンドを使用して詳細に検査するとよいでしょう。Mac OS Xのバイナリに対し てfileコマンドを実行した結果を以下に示します。
$ file /bin/sh
/bin/sh: Mach-O executable ppc
cronコマンドを使用すれば1日に1回コマンドを実行させて、結果をファイルに出力 させることも可能です。例えば、次のcrontabのエントリはSUIDやSGIDビットが設定 されたファイルを探し、1日前のリストと比較して相違点があれば、/var/log/sidlogファ イルに記録します。  また、以下のように実行すると、/var/log/sidlogにSUIDとSGIDファイルのリストを 出力します。
0 4 * * * find / \( -perm -4000 -o -perm -2000 \) -type f > \ /var/log/sidlog.new && diff /var/log/sidlog.new /var/log/sidlog && \ mv /var/log/sidlog.new /var/log/sidlog

2014/11/11

1.セキュアなマウントポイントの設定について

マウントオプションを適切に設定して攻撃による被害拡大を防ぐ

 ファイルシステムは、Unixシステムを利用するための基本的な要素です。したがって、 もしも攻撃者によってコンピュータに侵入されてしまった際に、重要なファイルにアク セスされることを防ぐために、ファイルのパーミッションは適切に制限されていることが 望ましいといえます。そのためにはファイルアクセスを制限できるマウントオプションを 用いるとよいでしょう。  「マウントオプション」はファイルシステムへのアクセス方法を制御するためのオプ ションです。マウントオプションはファイルシステムがマウントされる際に、OSカーネ ルに引き渡されます。例えば、nodevオプションを指定すると、デバイスノード(デバ イスファイル)を無効にできます。また、noexecオプションでプログラムの実行を禁止 でき、nosuidオプションでSUIDビットを無効にすることができます。roオプション を指定すると、ファイルシステムを読み出し専用でマウントすることもできます。  これらのマウントオプションは、mountコマンドの-oオプションに指定します。例 えば、プライマリIDEハードディスクの3番目のパーティションをnodev、noexec、 nosuidの各マウントオプションを指定して、/tmpにマウントするには、次のコマンド を実行します。
# mount -o nodev,noexec,nosuid /dev/hda3 /tmp
これを/etc/fstabで設定するには、次のように記述します。 /dev/hda3 /tmp ext3 defaults,nodev,noexec,nosuid 1 2  使用目的を慎重に考慮して目的別にパーティションを分割し、それぞれのパーティ ションに適切なマウントオプションを設定します。これにより攻撃者がコンピュータに侵 入した後の活動を困難にすることができます。機能別にパーティションを分割するには、 システムがディレクトリへの書き込みが必要なのか、読み込みしか必要ないのかを分類 することです。通常の運用中に変更する必要のないディレクトリは、読み出し専用オプ ション(ro)でマウントすることを推奨します。このように読み出し専用オプションを適 用できるディレクトリとして/usrが考えられます。  言うまでもなく/homeのようなディレクトリは読み出し専用としてマウントするべきで はありません。しかしながら通常のUnixシステムにおいて、ユーザーがホームディレ クトリ上でSUIDされたプログラムを実行したり、デバイスファイルを作成したりするこ とを許可する必要はありません。そこで、/homeに独立したパーティションを割り当て、 nodevオプションとnosuidオプションを設定してマウントするとよいでしょう。 またユーザーのホームディレクトリに実行ファイルを置かせないのであれば、noexecマウ ントオプションを追加するのもよいでしょう。また、/tmpや/varディレクトリについて も、これらのディレクトリ上にデバイスファイルを作成したり、実行ファイル(SUIDビッ トの有無を問わず)を置いたりする必要はありません。/tmpやホームディレクトリのよう な共有のファイルシステムをマウントオプションで制限しておけば、攻撃者によるトロイ の木馬などの悪意あるプログラムの実行を防ぐことができます。
nodevオプションがchroot環境で動作しているファイルシステムに適用されていた場 合、chroot()を呼び出して動作しているサービスが機能しないかもしれないことに注意 してください。これはchroot環境下では、/dev/logや/dev/nullなどのデバイスファイ ルが必要なためです。
攻撃者が前述のようなマウントオプションによる制限を回避可能な方法も数多く存在 します。例えばLinuxにおいて、noexecオプションを指定したファイルシステム上で あっても、/lib/ld-linux.soを使用してファイルを実行することが可能です。ld-linux.so を実行不可能とすることで、この問題を解決できると考えるかもしれませんが、そのよ うにするとすべての動的リンクライブラリを用いるプログラムが実行できなくなってしま います。現実的ではありませんが、システム上のすべてのプログラムを静的リンクする ことでこの問題を解決できます。  このようにLinuxにおいてnoexecオプションはほとんど役に立たない可能性があり ます。結局のところroot権限を奪った攻撃者に対しては、これらのマウントオプション を与えたファイルシステムでさえも無意味で、-o remountオプションで再マウントさ れてしまいます。  しかしながらマウントオプションを設定しておけば、root権限を奪う前の攻撃者や悪 意あるユーザーの行動を制限することが可能なのです。

ユーザーやグループへのリソース制限

制限シェルの利用

ワンタイムパスワードによる認証を使う

SCPとSFTPのユーザーを制御する

PAMによるログインの制御

Systraceポリシーの自動生成

Systraceによるシステムコールの制限

コマンドバイナリの改ざんに備える

スタックへの攻撃防止

ProFTPDの認証にMySQLを利用

サンドボックスによる実行環境の制限

サービスのネットワーク利用を制御

ネットワークサービスのチェック

暗号シグネチャの自動検証

管理権限の分担化

POSIX ACLで柔軟な権限を設定

2014/11/10

電子書籍について

電子書籍が増えて、本のスペース分、部屋が広くなり快適なのだが、電子書籍で本を読んでも紙の本より内容が頭に入ってこない。
これは、本を読むことは単に活字を目で追うだけでなく、雰囲気や五感も使って情報を得ているからだろうか。IT化の弊害か。
電子書籍は簡単に買えて、保存も管理も楽。故に、書籍数が増えて、情報が増える。故に、頭で処理しきれず情報が薄まっているのか。いつでも読めるっていう安心感も読むのを中断させる原因となってるかもしれない。
なので、得た情報をもっとアウトプットしていくことが必要だと思う!
もっと日々ブログに研究結果や調査結果を残していくべきだ!

2014/11/08

何を作ればいいか

作りたいものはたくさんある。
だが、時間は有限であり、
その中で何を作るか。

当然、利益を生み出す何かを作ることが重要。

2014/09/15

test

Wwww

Qdddd

2014/03/17

2014/02/15

分析指標を扱っていく。

データサイエンティスト熱が自分の中で再燃してきた。というのも、今後、開発以外でエンジニアの進路を考えていかないといけない時代にさしかかっているから。
プロマネか、アナリスト的な位置?

2014/02/03

メールからの投稿テスト

Bloggerへの投稿っていちいち面倒な感じがするので、
なんとか楽したい。
そのためメールでの投稿を可能にして、
なんとか簡単にしていきたい。

2014/01/08

Title

I have a issue.
Written with StackEdit.

自動でWEBブラウザテストを実行してみる!(selenium + eclipse + java)

1.eclipseの準備 2.selenium IDE(katalon recoder by firefox)で動作記録する。 3.javaファイルにエクスポートする。 4.eclipseで実行