概要
自分が持っているサーバに対して無料でセキュリティチェック(脆弱性診断)を行います
脆弱性について初期知識を学びつつ、実際にポートスキャンや脆弱性スキャンを行って自分のサーバは問題ないのかチェックまでしてみたいと思います
最近では、セキュリティ専門家の有志が脆弱性診断を実施する技術者を「脆弱性診断士」として必要なスキルを明文化する取り組みが行われていて将来的には資格化も目指しているらしいです
ちなみにJPCERTで脆弱性に関する情報をWebサイトで公開しているので定期的に確認するといいかもしれません
お願い・注意
自身の管理下にないネットワークおよびコンピュータに脆弱性診断や擬似攻撃を行った場合は法的処置をとられる可能性もあるので絶対にやらないようにしてください
このページに記述する内容は自身で管理している環境で検証を行ってください
脆弱性について
脆弱性(ぜいじゃくせい)とは、プログラムのバグなどによって引き起こされる情報セキュリティ上の欠陥のこと
脆弱性が発見されるとソフトウェアを開発した人が脆弱性に対しての修正プログラムを作成して提供するのでサーバ運用担当者はソフトウェアのアップデートを行う必要がある
こうした脆弱性対応は必須ではないが(会社などの組織の方針によっては対応が必須の所があり)対応しない場合、最悪不正アクセスが行われたり、ウイルスに感染したりすることが挙げられる
脆弱性に対して完全な対策を行うことは不可能に近いので脆弱性に関する報告があった場合に都度対応していくのが理想である
脆弱性診断とは
脆弱性診断とはシステムやアプリケーションに対して、どこにどのような脆弱性があるのかを調査することを言う
診断に使うツールはセキュリティベンダがサービスとして提供している
脆弱性診断には複数の種類がある
- プラットフォーム診断
- OSやミドルウェアに存在する脆弱性を確認
- Webアプリケーション診断
- Webアプリケーションに隠されている脆弱性の確認
- ペネトレーションテスト
- システム全体を対象に実際の攻撃手法を用いてどこまで侵入できるかを確認
- 1と2を組み合わせる
- ソースコード診断
- ソースコード上に隠されている脆弱性を確認
脆弱性診断の手法について
- ブラックボックステスト
- 診断対象のシステムに対して擬似攻撃を行ってどうなるのかを分析して脆弱性を洗い出す
- ホワイトボックステスト
- 設定ファイルやソースコードなどを分析して脆弱性を洗い出す
- 情報漏洩しないか、ユーザからの入力データ・チェックが行われているかなど
これらについてツールを使いつつ、網羅できないところはエンジニアが確認しながら脆弱性のチェックをやっていくことになる
脆弱性診断のはじめ
まずはOSやミドルウェアのどこに問題があるのかを把握するところからはじめる
以下の2つの観点で、問題点を洗い出してみる
- ポートスキャン
- どのサービスが稼働しているのかを調べる
- 脆弱性スキャン
- 稼働しているサービスのセキュリティチェック
攻撃者が対象のホストに攻撃を行う場合に事前の準備としてポートスキャンと呼ばれる調査を行う、これは「外部から対象サーバへアクセスが可能か?」「脆弱性のあるサービスが動いていないか」を調べる作業
例えば80番が開いていればhttpサービスが動いている、110番ならばPOP3のメール受信サーバが稼働しているなどがわかる、攻撃者はポートスキャンを悪用してアクティブになっているポートを見つけ、それが既知の脆弱性を持つサービスであればその脆弱性をつついて攻撃を行ってくる
従って自分の環境を守るにはまずはポートスキャンによってどのサービスが稼働しているかを調べて、稼働しているサービスがどのような脆弱性を持っているのかを調べる必要がある
ポートスキャンをする
実際にポートスキャンを行う
検証環境について
- CentOS 6系で行う
- ポートスキャンツールにはnmapを使う
nmpaを使うためのインストール
$ sudo yum install nmap
ローカル環境に対してポートスキャンを行う
$ sudo nmap 127.0.0.1 Starting Nmap 5.51 ( http://nmap.org ) at 2016-06-11 22:23 UTC Nmap scan report for localhost (127.0.0.1) Host is up (0.0000040s latency). Not shown: 997 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 3306/tcp open mysql Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
22(ssh), 80(http), 3306(mysql)が立ち上がっていることがわかる
「-A」オプションでOSやバージョンを検知できるなら表示する
$ sudo nmap -A 127.0.0.1 | grep '/tcp' 22/tcp open ssh OpenSSH 5.3 (protocol 2.0) 80/tcp open http Apache httpd 2.2.15 ((CentOS)) 3306/tcp open mysql MySQL 5.6.29
ポートスキャンはTCPとUDPでのスキャンがあったりでnmapのオプション色々あるが今回は略
このnmapの情報を元に不要なサービスは閉じて無駄な脆弱性を無くすように努めることになる
脆弱性スキャンをする
OpenVASを使って脆弱性スキャンを行う
OpenVASはオープンソースの脆弱性スキャナで、診断対象にインストールされているソフトウェアやそれらの設定・構成に脆弱性があるかどうかを調べる
OpenVASでは脆弱性に関する情報とそのテスト設定をNVTという単位で管理している、NVTは日々更新されていてOpenVASを通して配信されるので最新の脆弱性にも対応しやすい
// CentOSの標準リポジトリにはopenvasがないのでAtomicorp Repositoryというリポジトリを参照する $ sudo bash -c " wget -q -O - http://www.atomicorp.com/installers/atomic | sh" // OpenVASインストール $ sudo yum -y install openvas // redisをインストールする $ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm $ sudo yum --enablerepo=remi -y install redis // redisの設定変更 $ sudo vim /etc/redis.conf # 下記2行のコメントアウトを解除 unixsocket /tmp/redis.sock unixsocketperm 700 $ sudo /etc/init.d/redis start $ sudo chkconfig redis on // bzip2も入れておく $ sudo yum install bzip2
初期設定を行う
// エラーにならないように以下の設定を行う $ sudo vim /usr/sbin/openvas-scapdata-sync SPLIT_PART_SIZE=0 ↓ SPLIT_PART_SIZE=10000 // 脆弱性定義DBの構築と定義のダウンロードが開始される $ sudo openvas-setup ... 環境にもよると思うが完了まで2~3時間かかる ... ... 以下WebUIで利用するための入力項目 ... # 全てのIPからの接続を許可 Allow connections from any IP? [Default: yes] # Web UI で使用する管理者アカウント名の設定 Enter administrator username [Default: admin] : # Web UI で使用する管理者アカウントのパスワード設定 Enter Administrator Password: Verify Administrator Password:
ちなみにopenvas-scapdata-syncのファイルを書き換えなかった場合、以下のエラーが出た
.... /usr/sbin/openvas-scapdata-sync: line 1063: 6948 強制終了 xsltproc --stringparam refdate $CVE_REFDATE $SCAP_RES_DIR/cpe_youngerthan.xsl - -:1: parser error : Document is empty unable to parse - [e] Update of CPEs failed: xsltproc exited with code 137 メモリが足りないのかファイルが大きすぎるのかわからないがSPLIT_PART_SIZEで1000kごとにファイルを分割する設定を入れることでこのエラーは出なくなる
その他openvasを使うためのコマンドを実施していく
// クライアント証明書(?)を作成する $ sudo openvas-mkcert-client -n -i $ ls -l /var/lib/openvas/CA/clientcert.pem -rw-------. 1 root root 8058 Jun 13 19:19 /var/lib/openvas/CA/clientcert.pem // ユーザー作成 (ユーザ、パスは各自変更する) $ sudo bash -c "openvasmd --create-user=tomsato --role=Admin && openvasmd --user=tomsato --new-password=tomsato" // scannerの再起動 $ sudo service openvas-scanner stop $ sudo service openvas-scanner start // rebuild (managerをstopした状態で実施する) $ sudo service openvas-manager stop $ sudo openvasmd --rebuild $ sudo service openvas-manager start // openvas-managerが変な感じにLISTENしてるので一回killする $ sudo netstat -anp | grep 93 tcp 0 0 0.0.0.0:9391 0.0.0.0:* LISTEN 2193/openvassd tcp 0 0 0.0.0.0:9392 0.0.0.0:* LISTEN 2243/gsad tcp 0 0 :::9390 :::* LISTEN 2215/openvasmd unix 3 [ ] STREAM CONNECTED 938654 257/sshd unix 3 [ ] STREAM CONNECTED 938653 259/sshd // netstatの出力の右のほうに出ているopenvasmdのプロセス番号を指定してkillする $ sudo kill -term 2215 $ sudo openvasmd -p 9390 -a 0.0.0.0 // GSA(Greebone Security Assistant)の再起動 $ sudo service gsad restart
ここまでの設定などが問題ないかcheckスクリプトを実行する
$ sudo sh openvas-check-setup 以下のように出ればセットアップに成功している It seems like your OpenVAS-8 installation is OK. エラーが出た場合はFIX: と表示されている部分の指示に従ってコマンドを実施する
完了したらhttps://:9392にアクセスする
ログインをすると以下の画面が出るはず
とりあえず実行してみたいので女性右側にある「Immediately scan」を実行する
Immediately scanとはIPやホストを指定して脆弱性スキャンを実施するシンプルな機能、UDPに対する脆弱性スキャンは行わずにあらかじめ登録されたTCPの4481ポート分のスキャンになる
カスタマイズは可能なので興味があれば試してみてください
「localhost」と入力して「Start Scan」、画面上部に進行率が出ているのがわかる
完了したら「Immediate scan of IP localhost」をクリック、結果が見れる
「Results」をクリックしてスキャン結果を見る、検出された脆弱性一覧が表示されている
「Severity」は重大度みたい
「Vulnerability」の項目をクリックすると詳細が見れるので試しにSeverityがHighになっているものを見てみる
MySQLのパスワードが空…
こんな感じで気になるサーバで試してみてください
コメントを書く
コメント一覧