Postgresコンテナを使用して、重要ではない小さなアプリやサイトをいくつか実行しています。しばらく安定していますが、コンテナが短時間実行された後、コンテナは深刻なCPUを消費し始めました。 Postgresコンテナーを使用する他のすべてのコンテナーを削除しました。新しいインスタンスを開始した後でも、過度のCPU使用率が再発します。私のホスト(_docker stats
_)には、次のように表示されます。
_CONTAINER ID NAME
CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS cd553249727d data_postgresql.1.ft2gof5jci25xs5w5uqw6eezi
814.52% 22.11MiB / 46.95GiB 0.05% 129kB / 116kB 0B / 692kB 23
_
そしてこれ(top
):
_ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28923 70 20 0 633580 19664 488 S 696.7 0.0 2408:51 Dp2N
_
コンテナ(top
)に次のように表示されます:
_Mem: 42042244K used, 7183656K free, 3622600K shrd, 1952K buff, 30585480K cached
CPU: 63% usr 9% sys 0% nic 26% idle 0% io 0% irq 0% sirq
Load average: 9.77 9.70 9.66 13/508 11090
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
94 1 postgres S 618m 1% 3 58% ./Dp2N <----- WTF?!?!?
53 52 postgres S 1588 0% 1 1% {systemd} /bin/sh ./systemd
47 1 postgres S 163m 0% 8 0% postgres: postgrea67 postgres 10.2
22 1 postgres S 161m 0% 0 0% postgres: autovacuum launcher proc
20 1 postgres S 161m 0% 8 0% postgres: writer process
21 1 postgres S 161m 0% 5 0% postgres: wal writer process
1 0 postgres S 161m 0% 0 0% postgres
19 1 postgres S 161m 0% 8 0% postgres: checkpointer process
23 1 postgres S 19988 0% 1 0% postgres: stats collector process
11081 53 postgres R 1588 0% 4 0% [systemd]
33 0 root S 1576 0% 9 0% sh
52 47 postgres S 1568 0% 10 0% sh -c setsid ./systemd
39 33 root R 1508 0% 11 0% top
11083 11081 postgres Z 0 0% 5 0% [grep]
11084 11081 postgres Z 0 0% 4 0% [awk]
_
クエリアクティビティ(select fun308928987('setsid ./systemd')
が何をするかわからない):
_postgres=# select backend_start, usename, application_name, client_addr, client_hostname, query from pg_stat_activity;
backend_start | usename | application_name | client_addr | client_hostname | query
-------------------------------+------------+------------------+-------------+-----------------+-------------------------------------------------------------------------------------------------------------
2018-05-23 07:34:14.694057+00 | postgres | psql | | | select backend_start, usename, application_name, client_addr, client_hostname, query from pg_stat_activity;
2018-05-23 01:26:55.235556+00 | postgrea67 | | 10.255.0.2 | | select fun308928987('setsid ./systemd');
2018-05-23 07:26:03.519231+00 | postgrea67 | | 10.255.0.2 | | select fun308928987('setsid ./systemd');
_
サービスログには、このエラーの大量のインスタンスも含まれています。
_data_postgresql.1.ft2gof5jci25@IS-57436 | ps: bad -o argument 'command', supported arguments: user,group,comm,args,pid,ppid,pgid,etime,Nice,rgroup,ruser,time,tty,vsz,stat,rss
_
コンテナー内の_Dp2N
_プロセスを強制終了すると、CPU使用率は通常に戻りますが、すぐに何かがそのプロセスをスピンアップします。 _Dp2N
_に関する情報が見つかるかどうかをググってみましたが、役に立ちませんでした。外部にマウントされたボリュームにあります:
_/ # ls -al /var/lib/postgresql/data/pgdata/Dp2N
-rwxrwxrwx 1 postgres postgres 1886536 May 22 23:25 /var/lib/postgresql/data/pgdata/Dp2N
_
しかし、私が見る限り、それはベースイメージの一部ではないため、作成されたように見えます。
私はpostgres:9.6.9-Alpineを使用しています。問題はpostgres:9.6.8-Alpineで始まりましたが、アップグレードしても修正されませんでした。これが私を狂わせているので、どんな助けでも大歓迎です!
file
の実行結果:
_Sudo file /var/data/pgdata/pgdata/Dp2N
/var/data/pgdata/pgdata/Dp2N: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=bcb5ccf2bc22d1fcb0676506d7c7f31a9b7148bc, stripped
_
アルパインにはps
コマンドの限定バージョンが付属していることがわかりました。これを実行する:
_apk --no-cache add procps
_
拡張バージョンを取得し、ログ内のps
関連エラーを防止します。これを含むようにPostgresイメージを更新しましたが、これまでのところ問題は再発していません。推測は、失敗後にコマンドを繰り返し実行しようとしてCPUがスラッシュされていることです。
診断
以下の回答のとおり、私はハッキングされたことが判明しました。私は現在彼らがどうやって入ったかに途方に暮れています。 SSH証明書/パスワードアクセスなしでrootが無効になっている特定のユーザーにサーバーがロックされています。 (「最後」には、ハッキングされていない限り、私のアクセスのみが表示されます。)postgresqlへのパブリックアクセスはありません。非常に強力なデータベース管理者パスワード。現在、他の1つのコンテナからのみアクセスされています。サーバーのWebサイト経由でアクセスした可能性が高いようですが、この場合はホストOSではなく、コンテナのオペレーティングシステムまでしかアクセスしていません。 FWIW私はWordpressサイト、Grafana、Kibana、Traefik、Portainer、および私自身の.NETベースのAPIを実行しています。Wordpress最初にシェイクダウンします。これは、以前プラグインに関連した感染を経験したことがあるからです。
教育目的のため:
あなたはハッキングされており、ハッカーのために暗号通貨を採掘しています。
彼らはあなたのpostgresqlサーバーのスーパーユーザーアカウントのパスワードを推測することで侵入しました。次に、lo_export機能を使用して、任意のシェルコマンドを実行するユーザー定義関数のバイナリを削除しました。それがfun308928987であり、このバイナリをラップするために作成されたSQL関数です。
最善のクリーンアップは、サーバーを破壊して再構築することです。今回は、スーパーユーザーアカウントに実際の強力なパスワードを設定します。あるいは、pg_hba.confを変更して、外部ユーザーからのスーパーユーザー接続、できれば任意の接続を許可しないようにします。