序章

sysdigは、strace、tcpdump、lsofなどのよく知られたユーティリティの利点を1つのアプリケーションに組み合わせた、まったく新しいシステムレベルの調査およびトラブルシューティングツールです。 また、これだけでは不十分であるかのように、sysdigは、後で分析するためにシステムアクティビティをトレースファイルに保存する機能も提供します。

さらに、失敗したディスクI / O操作の表示からファイルの検索まで、一般的な問題の解決や監視のニーズを満たすために、インストールとともに豊富なスクリプトライブラリ( Chisels と呼ばれる)が提供されます。特定のプロセスがほとんどの時間を費やし、その間のすべてが費やされました。 必要に応じて、sysdigをさらに強化する独自のスクリプトを作成することもできます。

この記事では、最初に基本的なsysdigの使用法を紹介し、次にsysdigを使用したネットワーク分析について説明します。これにはCentOS7LAMPサーバーでのネットワークトラフィックの監査の例も含まれます。 例で使用されているVPSには大きな負荷がかかっていませんが、現在の監査タスクの基本を示すには十分であることに注意してください。

前提条件

始める前に、これらの前提条件があることを確認してください。

  • CentOS7ドロップレット
  • CentOS7VPSにLAMPサーバーをセットアップします。 手順については、この記事を参照してください。
  • さらに、sysdigの実行に使用される sudoaccessの非rootユーザーアカウントが必要です。

sysdigのインストール

サーバーにログインし、次の手順に従います。

ステップ1—DraiosGPGキーを信頼する

Draiosはsysdigの背後にある会社です。

インストール自体を続行する前に、yumはこのキーを使用して、ダウンロードしようとしているパッケージの信頼性を確認します。

DraiosキーをRPMキーリングに手動で追加するには、rpmツールと--importフラグを使用します。

sudo rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public  

次に、Draiosリポジトリをダウンロードし、それを使用するようにyumを構成します。

sudo curl -s -o /etc/yum.repos.d/draios.repo http://download.draios.com/stable/rpm/draios.repo

ステップ2—EPELリポジトリを有効にする

エンタープライズLinux用の追加パッケージ(EPEL)は、Fedoraプロジェクトによって維持されている高品質の無料のオープンソースソフトウェアのリポジトリであり、Red HatEnterpriseLinuxやCentOSなどのスピンオフと100% c互換性があります。 このリポジトリは、sysdigで必要なDynamic Kernel Module Support(DKMS)パッケージをダウンロードし、他の依存関係をダウンロードするために必要です。

sudo yum -y install epel-release

ステップ3—カーネルヘッダーをインストールする

これが必要なのは、sysdigがカスタマイズされたカーネルモジュール(sysdig-probeという名前)を構築し、それを使用して動作する必要があるためです。

sudo yum -y install kernel-devel-$(uname -r)

ステップ4—sysdigパッケージをインストールします

これで、sysdigをインストールできます。

sudo yum -y install sysdig

ステップ5—非rootユーザーとしてsysdigを実行します

セキュリティ上の理由から、sysdigを実行するにはroot以外のユーザーがいるのが最善です。 sysdigのカスタムグループを作成します。

sudo groupadd sysdig

1人以上のユーザーをグループに追加します。 この例では、ユーザーsammyを追加します。

sudo usermod -aG sysdig sammy

sysdigのバイナリファイルを見つけます。

which sysdig  

次のような応答が返される場合があります

/usr/bin/sysdig

sysdig グループのすべてのメンバーに、sysdig実行可能ファイル(およびそのバイナリのみ)を実行する権限を与えます。 /etc/sudoersを次のように編集します。

sudo visudo

グループセクションのsysdigグループに次の行を追加します。 %wheelセクションの後に新しい行を追加しても問題ありません。 パスをシステム上のsysdigの場所に置き換えます。

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

## sysdig
%sysdig ALL= /usr/bin/sysdig 

/etc/sudoersファイルの編集についてさらに説明が必要な場合は、この記事を参照することをお勧めします。

sysdigを実行しています

sysdigは2つのモードで実行できます。

サーバーアクティビティのリアルタイムストリームをライブで表示したり、システム操作の記録をファイルに保存して後でオフラインで分析したりできます。

2番目のオプションを使用する可能性が高いため、ここで説明します。 システムアクティビティをファイルに保存する場合、sysdigはオペレーティングシステムの完全なスナップショットを取得するため、その時間間隔中にサーバーで発生するすべてのものをオフライン分析に使用できることに注意してください。

注: sysdigコマンドを実行するときは、各オプションの前に短いダッシュが1つ付いていることを確認してください。 コピーして貼り付けると、1つのダッシュが長いダッシュとして貼り付けられ、プログラムによって認識されないという問題が発生する可能性があります。

基本的なsysdigコマンドを実行して、1000行のサーバーアクティビティをキャプチャしてみましょう。

システムアクティビティをact1.scapという名前のファイルにキャプチャし、出力を1000イベントに制限するには、次のコマンドを実行します(sysdigを不特定の期間実行する場合は、-n 1000の部分を省略します)。 。 -zスイッチは、トレースファイルの圧縮を有効にするために使用されます。

sudo sysdig -w act1.scap.gz -n 1000 -z

注:最後のステップで -n スイッチを省略した場合は、CTRL+Cキーの組み合わせを押すことでsysdigの実行を中断できます。

ノミ—sysdigスクリプトの概要

Chiselsはsysdigスクリプトです。 使用可能なノミのリストを表示するには、次のコマンドを実行する必要があります。

sudo sysdig -cl

sysdigによって作成されたトレースファイルを使用してCentOS7LAMPサーバー上のネットワークトラフィックを監査するために、ネットカテゴリで利用可能なノミを使用します。

Category: Net
-------------
iobytes_net         Show total network I/O bytes
spy_ip              Show the data exchanged with the given IP address
spy_port            Show the data exchanged using the given IP port number
topconns            top network connections by total bytes
topports_server     Top TCP/UDP server ports by R+W bytes
topprocs_net        Top processes by network I/O

特定のノミの詳細な説明は、その使用方法とともに、次のように表示できます。

sudo sysdig -i chisel name

例えば:

sudo sysdig -i spy_ip

これは以下を出力します:

Category: Net
-------------
spy_ip              Show the data exchanged with the given IP address
shows the network payloads exchanged with an IP endpoint. You can combine this chisel with the -x, -X or -A sysdig command line switches to customize the screen output
Args:
[ipv4] host_ip - the remote host IP address
[string] disable_color - Set to 'disable_colors' if you want to disable color output

Argsセクションは、チゼルに引数を渡す必要があるかどうかを示します。 spy_ipの場合、チゼルの引数としてIPアドレスを渡す必要があります。

ネットワークトラフィックの監査(実際の例)

sysdigを使用して帯域幅の使用を分析し、ネットワークトラフィックに関する詳細情報を確認する方法の実際的な例を見ていきましょう。

このテストから最良の結果を得るには、サーバーにダミーのWebフォームを設定して、適切なトラフィックが生成されるようにする必要があります。 これがLAMPを新しくインストールしたサーバーの場合は、/var/www/html/index.phpでこのフォームを作成できます。

<body>
<form id="loginForm" name="loginForm" method="post" action="login.php">
  <table width="300" border="0" align="center" cellpadding="2" cellspacing="0">
    <tr>
      <td width="112"><b>Username:</b></td>
      <td width="188"><input name="login" type="text" class="textfield" id="login" /></td>
    </tr>
    <tr>
      <td><b>Password:</b></td>
      <td><input name="pass" type="password" class="textfield" id="pass" /></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><br />
      <input type="submit" name="Submit" value="Login" /></td></tr>
  </table>
</form>
</body>

これは必須ではありませんが、すべてを整理するために、/var/www/html/login.phpページを作成することもできます。

<body>
	<p>Form submitted.</p>
</body>

警告:テストが終了したら、このフォームを削除してください。

ステップ1—オフライン分析のためにライブデータを保存する

次のコマンドを発行して、データのログ収集のキャプチャを開始します。

sudo sysdig -w act1.scap.gz -z -s 4096

sysdigを妥当な時間実行したままにします。 sysdigの実行中は、コマンドプロンプトがハングします。

次に、WebブラウザでサーバーのドメインまたはIPアドレスにアクセスします。 既存のページと存在しないページの両方にアクセスして、トラフィックを生成できます。 この特定の例を機能させたい場合は、ホームページにアクセスし、ログイン情報を好きなように入力して、ログインフォームを数回送信する必要があります。 さらに、MySQL/MariaDBデータベースへのクエリも自由に実行してください。

トラフィックを生成したら、CTRL+Cを押してsysdigを停止します。 これで、このチュートリアルの後半で説明する分析クエリを実行する準備が整います。

実稼働環境では、サーバーの混雑時にsysdigデータ収集を開始できます。

フィルタについて:クラスとフィールド

sysdigデータの並べ替えに入る前に、いくつかの基本的なsysdigコマンド要素について説明しましょう。

Sysdigは、クラスとフィールドをフィルターとして提供します。 オブジェクト指向プログラミング理論に基づく類推に従って、クラスをオブジェクトとして、フィールドをプロパティとして考えることができます。

次のコマンドを使用して、クラスとフィールドの完全なリストを表示できます。

sudo sysdig -l

トレースファイルを分析するときに、クラスとフィールドを使用して出力をフィルタリングします。

ステップ2—トレースファイルを使用したオフライン分析の実行

LAMPサーバーとの間のネットワークトラフィックを監査するため、トレースファイルact1.scap.gzをロードし、sysdigを使用して次のテストを実行します。

ネットワーク帯域幅を使用した上位プロセスのリストの表示

sudo sysdig -r act1.scap.gz -c topprocs_net

次のような出力が表示されるはずです。

Bytes     Process
------------------------------
331.68KB  httpd
24.14KB   sshd
4.48KB    mysqld

ここでは、Apacheが最も多くの帯域幅を使用していることがわかります(httpdプロセス)。

この出力に基づいて、情報に基づいてサポートされている判断の呼び出しを行い、現在および将来の推定要求に対応するために使用可能な帯域幅を増やす必要があるかどうかを判断できます。 それ以外の場合は、プロセスで使用できるすでに使用可能な帯域幅の最大レートに適切な制限を設けることができます。

プロセスごとのネットワーク使用量の表示

また、前の例に示したように、httpdによって消費されるネットワーク帯域幅を使用しているIPを知りたい場合もあります。

そのために、topconnsチゼル(合計バイト数で上位のネットワーク接続を表示)を使用し、クラスprocとフィールドnameで形成されたフィルターを追加してフィルター処理しますhttp接続のみを表示する結果。 つまり、次のコマンドです。

sudo sysdig -r act1.scap.gz -c topconns proc.name=httpd

これにより、リクエストを処理するプロセスがhttpdである、ソースを含むサーバーへの上位のネットワーク接続が返されます。

Bytes     Proto     Conn 	 
------------------------------
56.24KB   tcp   	111.111.111.111:12574->your_server_ip:80
51.94KB   tcp   	111.111.111.111:15249->your_server_ip:80
51.57KB   tcp   	111.111.111.111:27832->your_server_ip:80
51.26KB   tcp   	111.111.222.222:42487->your_server_ip:80
48.20KB   tcp   	111.111.222.222:42483->your_server_ip:80
48.20KB   tcp   	111.111.222.222:42493->your_server_ip:80
4.17KB	  tcp   	111.111.111.111:13879->your_server_ip:80
3.14KB	  tcp   	111.111.111.111:27873->your_server_ip:80
3.06KB	  tcp   	111.111.222.222:42484->your_server_ip:80
3.06KB	  tcp   	111.111.222.222:42494->your_server_ip:80

プライバシー上の理由から、元の送信元IPアドレスと宛先IPアドレスは隠されていることに注意してください。

このタイプのクエリは、サーバーにトラフィックを送信しているトップ帯域幅のユーザーを見つけるのに役立ちます。

上記の出力を見た後、送信元IPアドレスの後の数字はポートを表していると思われるかもしれません。 ただし、そうではありません。 これらの番号は、sysdigによって記録されたイベント番号を示します。

ステップ3—特定のIPとApacheの間で交換されるデータを分析する

次に、特定のIPアドレスとApacheの間の接続を詳しく調べます。

echo_fdsチゼルを使用すると、プロセスによって読み書きされたデータを表示できます。 特定のプロセス名とクライアントIP(この場合はproc.name=httpd and fd.cip=111.111.111.111など)と組み合わせると、このチゼルは、LAMPサーバーとそのクライアントIPアドレスの間で交換されたデータを表示します。

さらに、次のスイッチを使用すると、よりわかりやすく正確な方法で結果を表示できます。

  • -s 4096:イベントごとに、バッファーから最大4096バイトを読み取ります(このフラグを使用して、オフライン用にライブデータをトレースファイルに保存するときにディスクに保存する各データバッファーのバイト数を指定することもできます分析)

  • -A:データバッファのテキスト部分のみを印刷し、行末をエコーします(人間が読めるデータのみを表示したい)

これがコマンドです。 必ず111.111.111.111を前の出力のクライアントIPアドレスに置き換えてください。

sudo sysdig -r act1.scap.gz -s 4096 -A -c echo_fds fd.cip=111.111.111.111 and proc.name=httpd

そのIPアドレスによって行われた接続の数に応じて、かなりの出力が表示されるはずです。 404エラーを示す例を次に示します。

GET /hi HTTP/1.1
Host: your_server_ip
Connection: keep-alive
Cache-Control: m

------ Write 426B to 111.111.111.111:39003->your_server_ip:80

HTTP/1.1 404 Not Found
Date: Tue, 02 Dec 2014 19:38:16 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Content-Length: 200
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /hi was not found on this server.</p>
</body></html>

このタイプのクエリは、IPアドレスを使用して、最高の帯域幅によってどのような種類の接続が確立されたかを正確に把握するのに役立ちます。 たとえば、IPアドレスが特定のページに頻繁に到達していることがわかった場合は、そのページのアセットをできるだけ小さくして、帯域幅の使用を減らすことができます。 または、トラフィックが正当でないと思われる場合は、新しいファイアウォールルールを作成して、帯域幅を大量に消費するIPをブロックできます。

ステップ4—キーワードによってIPアドレスと交換されたデータを調べる

キャプチャ間隔中のサーバーアクティビティによっては、トレースファイルに非常に多くのイベントと情報が含まれている場合があります。 したがって、前のセクションのコマンドの結果を手作業で確認すると、非現実的な時間がかかる可能性があります。 そのため、イベントバッファで特定の単語を探すことができます。

Webサーバー上で一連のWebアプリケーションを実行していて、ログイン資格情報がフォームを介してプレーンテキストとして渡されていないことを確認したいとします。

前の例で使用したコマンドにいくつかのフラグを追加しましょう。

sudo sysdig -r act1.scap.gz -A -c echo_fds fd.ip=111.111.111.111 and proc.name=httpd and evt.is_io_read=true and evt.buffer contains form

ここで、クラスevtは、フィールドis_io_readとともに、(サーバーの観点から)読み取りイベントのみを調べることができます。 さらに、evt.bufferを使用すると、イベントバッファ内の特定の単語を検索できます(この場合、単語はformです)。 検索キーワードを、独自のアプリケーションにとって意味のあるものに変更できます。

次の出力は、ユーザー名とパスワードがプレーンテキストでクライアントからサーバーに渡されていることを示しています(したがって、十分な専門知識を持っている人なら誰でも読むことができます)。

------ Read 551B from 111.111.111.111:41135->your_server_ip:80

POST /login.php HTTP/1.1
Host: your_server_ip
Connection: keep-alive
Content-Length: 35
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://104.236.40.111
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://104.236.40.111/
Accept-Encoding: gzip,deflate
Accept-Language: en-US,en;q=0.8

login=sammy&pass=password&Submit=Login

同様のセキュリティホールを見つけた場合は、すぐに開発者チームに通知してください。

結論

LAMPサーバー上のネットワークトラフィックの監査でsysdigを使用して達成できることは、ほとんどの場合、想像力とアプリケーションの要求によって制限されます。 トップ帯域幅のユーザーを見つけ、特定のIPからのトラフィックを調べ、アプリケーションからの要求に基づいてキーワードで接続を並べ替える方法を見てきました。

現在の記事についてさらに質問がある場合、または現在のLAMP環境でsysdigを操作する方法について提案が必要な場合は、以下のフォームを使用してコメントを送信してください。