最近、誰かが非rootユーザーとしてLinuxサーバーの1つに侵入しました。
.bash_historyからの抜粋:
[...]
Perl
perl
set +o history
set +o history
set +o history
passwd
sdfsdf
passwd
exit
set +o history
コマンドロギングを.bash_historyに切り替えます
履歴ログを無効にできないようにする方法はありますか?
履歴が無効になっている場合に何が起こったかを知る方法はありますか?
Bashの履歴は、通常の場合、準有能な攻撃者に対しては役立ちません。
代替案があります。監査サブシステムです。 auditd をインストールして構成します。これにより、サンプルプログラムの実行や構成したその他のものがログに記録されます。基本的には、作成したフィルターに従って行われたシステムコールをログに記録します。
これで、本当にbash履歴に依存したい場合は、より安全にすることができます。最近のbashバージョンでは、ローカルユーザーファイルの代わりにsyslogにログを記録できます。次に、重要な場合は、syslogをリモートのsyslogサーバーにリダイレクトできます。
シェルから非シェルコマンドの実行を許可しても、実際には役に立ちません。たとえば、Perl(またはその他のスクリプト言語)を実行してbashを省略し、そこからコマンドを呼び出すと、bashロギングを回避できます。
攻撃者が実際に自分のトラックを非表示にしたい場合は、履歴ファイルを手動で編集するだけです。
Root以外のユーザーが、すでにbashに入力したコマンドを非表示にすることを難しくすることができます。しかし、これは攻撃者に適度な能力があることを要求するだけです。
HISTFILE
変数を読み取り専用にすると、bashは終了時に最後の$HISTFILESIZE
コマンドをそのファイルに保存します。 HISTFILESIZE
(およびHISTSIZE
)も読み取り専用にして、大きな値に設定できます。ただし、これは、たとえばhistory
ビルトインを使用して、終了する前に履歴をサニタイズすることで簡単に破られます。また、bashは各コマンドの後ではなく終了時に履歴エントリを書き込むため、kill -9 $$
でbashを終了するだけで、履歴は保存されません。 Zshは、各コマンドの後に履歴を保存するように指示できますが、攻撃者が簡単に元に戻すことができないわけではありません。chattr +a ~user/.bash_history
で追加専用にすることができます。 rootのみがファイルから追加専用属性を削除できます。上で見たように、これは攻撃者がミスした場合、痕跡を消去できないことを意味します。特定のシェルからのすべてのコマンドをログに記録できたとしても、これはセキュリティには役立ちません。攻撃者は別のアプリケーションからコマンドを発行するだけで、レッドフラグを立てず、もっともらしく拒否することができます。 (zsh
、fish
:わかりました。シェルを好みます。emacs
、vi
:テキストファイルを編集しました。ssh
:おそらく別のマシンに接続したかっただけです。~/bin/foo
:それは単なる無害なスクリプトですが2時間前のことを知っていますか?)
Linux(ほとんどのunicesと同様)には プロセスアカウンティング と呼ばれる単純なコマンド監査システムがあります。これは通常デフォルトで有効になっています。実行された各コマンドの実行可能ファイル名、時間、実行ユーザーは/var/log/account
(正確な場所はディストリビューション間で異なる場合があります)。そのログファイルは lastcomm
で表示できます。これはあなたの現在の法医学的な試みであなたを助けるかもしれません、しかしそれは適度に有能な攻撃者(例えばすべての実行可能ファイルを/var/tmp/$name/ls
にハードリンクすることによって)によって打ち負かされることができます—そのユーザーからのアクティビティがあったことを確実に知るすべては特定の時間に。
より徹底的な監査パッケージがあり、特に 監査サブシステム であること ジョンが推奨 です。 auditctl
を検索して、設定方法のいくつかの例を見つけてください。これは、パフォーマンスヒットが伴うため、通常、デフォルトではオンになっていません(これが実際にどれほど悪いかわかりません)。
(少なくとも部分的に)デフォルトでオンになっているもう1つの単純なツールは、ファイル時間です。ファイルのctimeが侵入前のものである場合、攻撃者はそれを変更していません。ファイルアクセス時間が有効になっている場合(これは、デフォルトで使用されていましたが、パフォーマンスのためにしばしば無効になっています。*atime
マウントオプションを確認してください)。
これらすべては、攻撃者がルートを獲得しなかったと想定します。そうでなければ、すべての賭けは無効になります。攻撃者が意図的に痕跡を残して、さらに妥協した痕跡だけを巧みに拭いてアクセスをエスカレーションしなかったように見せかけてもよいことを考慮してください。まったく心配している場合は、クリーンなバックアップ(および最初の侵入後に攻撃者が到達した可能性のある他のシステム)からそのシステムを再インストールします。
すべてのユーザーシェルを bash restricted Shell に設定します。 /etc/passwd
で、シェルを/bin/rbash
(/ bin/bashへのsimlinkである必要があります)、または/bin/bash -r
に設定します
Bashの制限付きシェルは、ユーザーがコマンド履歴などのシェルオプションを変更できないようにします。
また、上記のアイデアを補足するために、logwatchをインストールして構成し、cronを介して毎日(またはより頻繁に)実行し、監査目的で結果をメールで送信します。
インストールと構成:
DebianベースのLinuxでは、次のコマンドを入力します
apt-get install logwatch
RedhatベースのLinuxでは、次のコマンドを入力します。
yum install logwatch
Logwatchをカスタマイズするには、/ usr/share/doc/logwatch-* /ディレクトリに移動し、HOWTO-Customize-LogWatchファイルを読み取ります。
Logwatch.confファイルを編集します。
vi /etc/logwatch/conf/logwatch.conf
または
vi /usr/share/logwatch/default.conf/logwatch.conf
詳細については、logwatchのmanページを参照してください。