前書き
sysdigは、strace、tcpdump、lsofなどのよく知られたユーティリティの利点を1つのアプリケーションに統合した、まったく新しいシステムレベルの調査およびトラブルシューティングツールです。 また、これだけでは不十分であるかのように、sysdigはシステムアクティビティを保存して後の分析のためにファイルをトレースする機能も提供します。
さらに、失敗したディスクI / O操作の表示から特定のプロセスが最も費やしたファイルの検索まで、一般的な問題の解決または監視ニーズを満たすために、豊富なスクリプトライブラリ(_chisels_と呼ばれる)がインストールと共に提供されます。時間、そしてその間のすべて。 独自のスクリプトを記述して、ニーズに応じてsysdigをさらに強化することもできます。
この記事では、最初に基本的なsysdigの使用方法を紹介し、次にsysdigを使用したネットワーク分析を検討します。これには、CentOS 7 LAMPサーバーでのネットワークトラフィックの監査の例が含まれます。 例で使用されているVPSには大きな負荷はかかっていませんが、現在の監査タスクの基本を示すには十分です。
前提条件
開始する前に、これらの前提条件を満たしていることを確認してください。
-
CentOS 7ドロップレット
-
CentOS 7 VPSでLAMPサーバーをセットアップします。 手順については、https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-centos-7 [この記事]を参照してください。
-
さらに、https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-a-centos-7-server [sudoの非ルートユーザーアカウントが必要です。アクセス] sysdigの実行に使用されます
sysdigのインストール
サーバーにログインして、次の手順を実行します。
ステップ1-Draios GPGキーを信頼する
Draiosはsysdigの背後にある会社です。
インストール自体を進める前に、yumはこのキーを使用して、ダウンロードしようとしているパッケージの信頼性を検証します。
DraiosキーをRPMキーリングに手動で追加するには、 `-import +`フラグを指定した ` rpm +`ツールを使用します。
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リポジトリを有効にする
追加パッケージfor Enterprise Linux(EPEL)は、Fedoraプロジェクトが管理する高品質の無料のオープンソースソフトウェアのリポジトリであり、Red Hat Enterprise LinuxやCentOSなどのスピンオフと100%互換性があります。 このリポジトリは、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を実行するには非ルートユーザーが最適です。 sysdigのカスタムグループを作成します。
sudo groupadd sysdig
1人以上のユーザーをグループに追加します。 この例では、ユーザー* sammy *を追加します。
sudo usermod -aG sysdig
sysdigのバイナリファイルを見つけます。
which sysdig
次のような応答を受け取る場合があります
-
sysdig *グループのすべてのメンバーに、 `+ sysdig `実行可能ファイル(およびそのバイナリのみ)を実行する権限を付与します。 次のコマンドで ` / etc / sudoers +`を編集します:
sudo visudo
groupsセクションの* sysdig *グループに次の行を追加します。 `+%wheel +`セクションの後に新しい行を追加しても問題ありません。 システム上のsysdigの場所にパスを置き換えます。
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
## sysdig
%sysdig ALL=
`+ / etc / sudoers +`ファイルの編集についてさらに説明が必要な場合は、https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-をご覧になることをお勧めしますusers-on-a-centos-7-server [この記事]。
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
_ *注意:*最後のステップでスイッチを省略した場合、CTRL + Cキーの組み合わせを押すことでsysdigの実行を中断できます。 _
ノミ-sysdigスクリプトの概要
_Chisels_はsysdigスクリプトです。 利用可能なノミのリストを表示するには、次のコマンドを実行する必要があります。
sudo sysdig -cl
sysdigによって作成されたトレースファイルを使用してCentOS 7 LAMPサーバー上のネットワークトラフィックを監査するには、Netカテゴリで利用可能なノミを使用します。
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
例えば:
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> </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の実行中にコマンドプロンプトがハングします。
次に、ウェブブラウザでサーバーのドメインまたは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アドレスの後の数字がポートを表していると考えているかもしれません。 しかし、そうではありません。 これらの番号は、sysdigによって記録されたイベント番号を示します。
ステップ3-特定のIPとApacheの間で交換されるデータの分析
次に、特定のIPアドレスとApacheの間の接続をさらに詳しく調べます。
`+ echo_fds `チゼルを使用すると、プロセスによって読み書きされたデータを表示できます。 特定のプロセス名とクライアントIP(この場合は ` proc.name = httpdおよびfd.cip = 111.111.111.111 +`など)と組み合わせると、このチゼルはLAMPサーバーとそのクライアントIPアドレス。
さらに、次のスイッチを使用すると、よりわかりやすく正確な方法で結果を表示できます。
-
+ -s 4096 +
:各イベントについて、バッファから最大4096バイトを読み取ります(このフラグを使用して、ライブデータをトレースファイルに保存するときに、各データバッファのバイト数をディスクに保存するよう指定することもできますオフライン分析) -
+ -A +
:データバッファのテキスト部分のみを出力し、行末をエコーします(人間が読み取れるデータのみを表示したい)
コマンドは次のとおりです。 必ず、「++」を前の出力のクライアントIPアドレスに置き換えてください。
sudo sysdig -r act1.scap.gz -s 4096 -A -c echo_fds fd.cip= and proc.name=httpd
そのIPアドレスによって行われた接続の数に応じて、かなりの出力が表示されます。 404エラーの例を次に示します。
GET /hi HTTP/1.1
Host: your_server_ip
Connection: keep-alive
Cache-Control: m
------ Write 426B to :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アドレスが特定のページに頻繁にアクセスしていることがわかった場合、そのページのアセットをできる限り小さくして、帯域幅の使用を削減できます。 または、トラフィックが正当なものではないようであれば、新しいhttps://www.digitalocean.com/community/tutorials/how-the-iptables-firewall-works[firewall rule]を作成して帯域幅の占有をブロックすることができますIP。
ステップ4-キーワードでIPアドレスと交換されたデータを調べる
キャプチャ間隔中のサーバーのアクティビティによっては、トレースファイルに非常に多くのイベントと情報が含まれる場合があります。 したがって、前のセクションのコマンドの結果を手動で確認するには、実用的ではない時間がかかる可能性があります。 そのため、イベントバッファーで特定の単語を検索できます。
Webサーバー上で実行されているWebアプリケーションのセットがあり、ログイン資格情報がフォームを介してプレーンテキストとして渡されないようにする必要があるとします。
前の例で使用したコマンドにいくつかのフラグを追加しましょう。
sudo sysdig -r act1.scap.gz -A -c echo_fds fd.ip= and proc.name=httpd and evt.is_io_read=true and evt.buffer contains
ここでは、クラス「+ evt 」とフィールド「 is_io_read 」を使用して、読み取りイベントのみを(サーバーの観点から)調べることができます。 さらに、 ` evt.buffer `により、イベントバッファー内の特定の単語を検索できます(この場合、単語は `+`です)。 検索キーワードを、自分のアプリケーションにとって意味のあるものに変更できます。
次の出力は、ユーザー名とパスワードがプレーンテキストでクライアントからサーバーに渡されていることを示しています(したがって、十分な専門知識を持つ人であれば誰でも読めるようになります)。
------ Read 551B from :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=&pass=&Submit=Login
同様のセキュリティホールが見つかった場合は、すぐに開発者チームに通知してください。
結論
LAMPサーバー上のネットワークトラフィックの監査でsysdigを使用して達成できることは、想像力とアプリケーションの要求によってほとんど制限されます。 上位の帯域幅のユーザーを見つけ、特定のIPからのトラフィックを調べ、アプリケーションからのリクエストに基づいてキーワードで接続を並べ替える方法を見てきました。
現在の記事についてさらに質問がある場合、または現在のLAMP環境でsysdigを使用する方法についての提案が必要な場合は、以下のフォームを使用してコメントを送信してください。