ホーム » コンピュータ » Network (ページ 2)

Network」カテゴリーアーカイブ

サーバ⚙

アーカイブ

カテゴリー

WP Fastest Cache を試す

PHP の 7.4 への切り替えを行ったけど、インストール済みのパッケージに Cache 関連のモジュールがあって、あらためて WordPress の Cache を調べてみた。

WP Fastest Cache を Install

簡単に導入できそうな、WP Fastest Cache というのがあったので、導入してみた。

WordPressの普通のプラグインの要領でインストール。WordPress の左メニューに WP Fastest Cache が追加されるので選んでから、キャッシュさせたい項目を選んで保存するだけ。

職場の WordPress にも入れてみた。でも、どこまで効果が出ているかは、よくわからない。ある程度運用してから、CPU 負荷を確認するしかないかな。

追加

数日の様子を見たけど、サーバとしては特に負荷が下がったという雰囲気は無いな。

ただ、ページの表示は早くなったような気がする。

EdgeRouter-X ver 2.0.8-hotfix.1 に更新

気まぐれで確認してたら、ER-X v2.0.8-hotfix.1 が丁度出たところだった。

前回の古いイメージを消してから、イメージのアップロード。

$ slogin ubnt@edgerouter-x
# delete system image

speedtest-cliとrrdtool

インターネットとの通信速度を計測する speedtest-cli で Linux の上で測定できそうなので、毎日測定するようにしてみた。MRTG を単純に使うと5分おきになってしまうので、rrdtool を使って1日1回更新にてデータを生成させる。

#!/usr/bin/perl                                                                                                                             

my $pgname = "speedtest" ;
my $rrdfile = "/var/lib/munin/localdomain/localhost.localdomain-$pgname.rrd" ;
my $graphfile = "/var/cache/munin/www/localdomain/localhost.localdomain/$pgname.png" ;
my $rrdtool = "/usr/bin/rrdtool" ;
my $speedtest = "/usr/local/sbin/speedtest-cli" ;

my $time = time() ;
my $debug = 0 ;

sub fetchvalue {
    my ($upv , $dwv) = @_ ;
    my $upload = 0 , $download = 0 ;
    open( FH , "$speedtest |" ) or die( "Can't open $speedtest." ) ;
    while( my $line =  ) {
        if ( $line =~ /^Upload:\s*([\d\.]+)\s*(M|K|)bit\/s/i ) {
            $upload = $1 ;
            $upload *= 1000000 if ( $2 eq "M" ) ;
            $upload *= 1000 if ( $2 eq "K" || $2 eq "k" ) ;
        }
        if ( $line =~ /^Download:\s*([\d\.]+)\s*(M|K|)bit\/s/i ) {
            $download = $1 ;
            $download *= 1000000 if ( $2 eq "M" ) ;
            $download *= 1000 if ( $2 eq "K" || $2 eq "k" ) ;
        }
    }
    close( FH ) ;
    $$upv = $upload ;
    $$dwv = $download ;
}

sub create {
    my $cmd =
        "$rrdtool create $rrdfile"
        ." --step 86400"
        ." DS:upload:GAUGE:200000:0:U"
        ." DS:download:GAUGE:200000:0:U"
        ." RRA:LAST:0.5:1:7"
        ." RRA:AVERAGE:0.5:3:7"
        ." RRA:MIN:0.5:3:7"
        ." RRA:MAX:0.5:3:7"
        ;
    print $cmd."\n" if ( $debug ) ;
    system( $cmd ) ;
}

sub update {
    # rrdファイルが無ければ作る                                                                                                             
    create()
        unless( -f $rrdfile ) ;
    # 値を取得して更新                                                                                                                      
    my $upv , $dwv ;
    fetchvalue( $upv , $dwv ) ;
    my $cmd =
        "$rrdtool update $rrdfile"
        ." N:$upv:$dwv"
        ;
    print $cmd."\n" if ( $debug ) ;
    system( $cmd ) ;
}

sub graph {
    my $start = $time - 3600*24*200 ;
    my $cmd =
        "$rrdtool graph $graphfile"
        ." --imgformat PNG"
        ." --start $start"
        ." --end $time"
        ." --title \"SpeedTest\""
        ." --height 150"
        ." --font DEFAULT:7:Consolas"
        ." --vertical-label \"bit/sec\""
        ." --color FRAME#f3f3f3"
        ." --color AXIS#F3F3F3"
        ." --color SHADEA#f3f3f3"
        ." --color SHADEB#f3f3f3"
        ." --color ARROW#f3f3f3"
        ." COMMENT:\"               cur       avg         min         max\n\""
        ." DEF:upload=$rrdfile:upload:LAST"
        ." LINE:upload#00FF00:\"Upload  \""
        ." GPRINT:upload:LAST:\"%6.2lf%s /\""
        ." GPRINT:upload:AVERAGE:\"%6.2lf%s /\""
        ." GPRINT:upload:MIN:\"%6.2lf%s /\""
        ." GPRINT:upload:MAX:\"%6.2lf%s \n\""
        ." DEF:download=$rrdfile:download:LAST"
        ." CDEF:download_minus=download,-1,*"
        ." LINE:download_minus#0000FF:\"Download\""
        ." GPRINT:download:LAST:\"%6.2lf%s /\""
        ." GPRINT:download:AVERAGE:\"%6.2lf%s /\""
        ." GPRINT:download:MIN:\"%6.2lf%s /\""
        ." GPRINT:download:MAX:\"%6.2lf%s \n\""
        ." > /dev/null"
        ;
    print $cmd."\n" if ( $debug ) ;
    system( $cmd ) ;
}

if ( @ARGV > 0 && $ARGV[0] eq "config" ) {
    create() ;
} elsif ( @ARGV > 0 && $ARGV[0] eq "update" ) {
    update() ;
} elsif ( @ARGV > 0 && $ARGV[0] eq "graph" ) {
    graph() ;
} else {
    update() ;
    graph() ;
}

インターネット回線の速度テスト

ネットワーク速度って、Ether > WiFi としか思ってなかったけど、WiFiの方が倍以上速い結果になってら。パソコンもそれなりに古いとはいえ、そういう時代か。

改めて確認したら、パソコンが100MbpsのHUBに繋がっていたじゃん。そういえば、ルータのギガビットが埋まってて一時的に繋ぎ変えてたっけ。Edgerouter-X を HUB 接続してできた所につなぎ替え。

iPhone 10 WiFi – 11ac で、240Mbps

{CAPTION}

パソコンの Ether 経由をギガビットにつないで本来の速度。

パソコンの Ether 経由だけど100MbpsHUBに繋がってた。

WordPress多要素認証をTwo Factorに変更

WordPress は広く普及しているCMSソフトだからこそ、いい加減な設定だと乗っ取り被害も多く、パスワードの管理は極めて重要。

miniOrange

その中で、今までは miniOrange 社の 2段階認証プラグインを使っていた。機能も多く便利だったけど、便利な認証が有償機能になり、一般的な”Google Authenticator”のような有効時間付きPIN番号の認証機能を使っていた。

他にも様々な2段階認証の方法が使えるけど、その認証は有償だし、他の認証プラグインを探す。

Google Authenticator

改めて探すと、Google Authenticator という名前の認証プラグインが見つかった。名前通りの”Google Authenticator”対応。でも個人の作者の作品みたい。

上記の Google Authenticator は、認証が”Google Authenticator”とバックアップコードだけど、バックアップコードはメモしておくのが面倒なんだよな。

Two Factor

ということで、さらに探してみたら”Two Factor”というプラグインがある。

作者も Plugins Contribution という団体?だし、多要素認証もメールへの認証コード送信、認証アプリ、FIDO認証キー、バックアップコードと基本的な機能を網羅している。ということで、これを入れて登録。

ネットワーク攻撃の目的

ブラックハッカーがインターネットで攻撃する目的は何か?

愉快犯・自己主張

ハッカーが攻撃を行う理由は、古くは愉快犯だったり自己顕示欲といった理由であった。

  • 愉快犯 – システムが動かずに混乱している様を楽しむ
    • DoS 攻撃(Denial of Service: サーバが仕事ができないようにする攻撃)
    • システムのデータベースを破壊する
  • 自己主張
    • 自己顕示欲 – すげーことしたという満足感
    • 政治的主張 – 堂々とできない批判を行う
  • 別の攻撃の地盤づくり – 地盤を作る目的は…次の「金」を参照
    • ウィルス/マルウェアの拡散
    • 他の攻撃のための踏み台
    • ボットネットの構築

金、カネ、Money…

しかし最近は、お金が目標。

  • 宣伝 – アダルトサイトの宣伝による広告収入目
    • Webサイトに、不正な広告へのリンクを書き込む
    • 不正な広告を行う迷惑メールを大量送信
  • 脅す – XXされたくなかったら金を送れ。
    • DoS 攻撃でシステムを止めるぞ!
    • 奪ったデータを公開するぞ!
    • 重要データを暗号化した。元に戻したかったら金を送れ!(ランサムウェア)
  • 盗む
    • 軍事機密、機密研究の情報を盗む。
    • ネットバンクで不正送金、クレジットカード情報で買い物、仮想通貨で盗む

ファイル操作・リダイレクト・LOG解析

ファイル操作やリダイレクトといったLinuxでのファイルの基本操作については、講義用資料を参照。 実際の操作演習に使うファイルを、Raspberry-Pi によるサーバに入れてある。そのファイルで腕試しをしてね。

ファイアウォールとiptables

インターネットからの攻撃を防ぐには、ファイアウォールが必要となる。外部からの接続をうけるコンピュータは、ファイアウォールがどう設定されているのか把握することが重要。

ファイアウォールとDMZ

ファイアウォールは、パケットの(送信元IPアドレス,送信元ポート番号)、(宛先IPアドレス,宛先ポート番号)を見て、通信を制限するルータであり、専用のファイアウォールではさらに細かい制限を加えたり、通信履歴を保存することができる。

組織向けの外部公開のWebサーバやメールサーバを持つ組織では、外部からの接続をうける必要があり、脆弱性があればサーバは乗っ取りなどの被害に会いやすい。サーバが被害を受けたらファイアウォール内部のコンピュータに被害が広がる(トロイの木馬)のは危険であることから、(1) DMZ(非武装地帯)内部に外部公開のサーバを置き、(2) 対外FireWallで外部からのパケットはすべてDMZだけに通す。(3) 内部FireWall では、DMZ の特定の受信パケットだけ流す様にする。

DMZ内部のサーバは、外部からの攻撃をうけるため、極めて慎重にセキュリティ対策を行う必要がある。

iptables

Linux で FireWall を構築するときには、iptables を用いる。iptables では、主に以下の3つのルール(チェイン)でパケットを制限できる。

  • コンピュータに入ってくるパケットに対するルール(INPUT チェイン)、
  • コンピュータから出ていくパケットに対するルール(OUTPUTチェイン)、
  • コンピュータで中継するパケットに対するルール(FORWARDチェイン)

iptables の設定を見るには、iptables -L を実行する。

$ sudo iptables -L  # すべてのルールを表示
Chain INPUT (policy DROP)
target     prot opt source           destination         
DROP       all  --  anywhere         anywhere      state INVALID
ACCEPT     all  --  192.168.11.0/24  anywhere            
ACCEPT     tcp  --  anywhere         anywhere      tcp dpt:http
ACCEPT     tcp  --  anywhere         anywhere      tcp dpt:https
:
Chain FORWARD (policy DROP)
target     prot opt source           destination         
DROP       all  --  anywhere         anywhere      state INVALID
ACCEPT     all  --  127.0.0.0/8      anywhere            
ACCEPT     all  --  192.168.11.0/24  anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source           destination         
ACCEPT     all  --  anywhere         anywhere      state RELATED,ESTABLISHED

iptables で制限のための設定を間違えると、通信ができなくなるので、基本的な考え方だけを紹介する。

「条件にマッチしたパケットをどうするのか」というルールを、チェインに並べておき、パケットが届くとチェインの先頭からルールを適用し、ACCEPT/REJECT/DROPなどの対応を決める。

iptables でルールを登録する場合は、一般的に以下の書式で、条件1,条件2… をすべて満たすパケットをどうするのかのラベルを最後に記載する。

$ iptables -A チェイン 条件1 条件2 … -j ラベル

$ iptables -P INPUT DROP            # デフォルトポリシーの設定
  # INPUT のルールにどれもマッチしない場合はDROP(パケット廃棄)
$ iptables -P OUTPUT ACCEPT
  # OUTPUT のどのルールにもマッチしなければACCEPT(受信許可)

$ iptables -A INPUT -s 127.0.0.1 -j ACCEPT
  # INPUT の末尾に、"送信元IPが 127.0.0.1 ならACCEPT" を追加

$ iptables -A INPUT --dport 80 -j ACCEPT
  # INPUT の末尾に、"宛先ポートが 80 ならACCEPT" を追加

$ iptables -A INPUT -s 11.22.33.44 -j DROP
  # INPUT の末尾に、"送信元IPが 11.22.33.44 ならDROP" を追加

iptablesのオプション引数
  -P      デフォルトポリシーの設定
  -A      末尾にルールを追加
  -s      送信元IPアドレスの条件指定
  -d      宛先IPアドレスの条件指定
  --sport 送信元ポート番号の条件指定
  --dport 宛先ポート番号の条件指定
  -j      指定ラベルに移動

INPUT chain
  |
<送信元IPが127.0.0.1なら>----ACCEPT
  |
<宛先ポートが80なら>----------ACCEPT
  |
<送信元IPが11.22.33.44なら>--DROP
  |
  DROP

ユーザとリモート処理

Linux ではユーザを切替えながら処理を実行したり、ネットワークを越えて命令を実行することができる。外部から攻撃を受けてバックドアが仕掛けられていて不正侵入をうけているのか確認する時に、どういったユーザの処理を実行しているのか把握し、リモート接続で処理ができるような状態なのか知ることが重要。

ユーザとユーザの切り替え

ユーザ,グループの管理

unix では、ユーザ情報は /etc/passwd , /etc/group で管理している。passwdファイル先頭の、ユーザ番号 0 は、なんでもできる権限を持つシステム管理者 root となっている。ユーザ番号 1~999 は、システムを動かすための特殊なユーザとなっている。1000以上は、実際のユーザに割り当てることが多い。

((( /etc/passwd )))
root:x:0:0:root:/root:/bin/bash
sshd:x:111:65534::/var/run/sshd:/usr/sbin/nologin
tsaitoh:x:1000:1000:Tohru Saitoh,,,:/home/tsaitoh:/bin/zsh
| tsaitoh = ユーザ名
| x       = 昔はパスワードが書いてあった, *ならアカウントロック
| 1000    = ユーザ番号
| 1000    = グループ番号
| Tohru Saitoh,,, = ユーザの名前など
| /home/tsaitoh   = ホームディレクトリ
| /bin/zsh        = シェル
  
((( /etc/group )))
root:x:0:
ssh:x:112:
home:x:1000:tsaitoh
| home = グループ名
| x    = 昔はパスワードが書いてあった, *ならアカウントロック
| 1000 = グループ番号
| tsaitoh = グループに所属するユーザ名(コンマ区切り)

ただし、/etc/passwd, /etc/group は、全ユーザが読めるファイルで、暗号化されたパスワードを覚えるには不向きなので、/etc/shadow , /etc/gshadow に保存されている。

ユーザの確認

自分の情報を確認するには、whoamiid , finger コマンドを用いる。

$ whoami    # ユーザ名を表示
tsaitoh

$ id        # UIDやGIDなどの情報を表示
uid=1000(tsaitoh) gid=1000(home) ....

$ finger    # ユーザの詳しい情報を表示
Login    Name           Tty      Idle  Login Time   Office          Office Phone
tsaitoh  Tohru Saitoh   pts/0          Feb 17 22:47 (192.168.11.xx) 12-3456

su コマンド

ユーザを切り替えるには、su コマンドを用いる(Set User)。別ユーザで命令を実行することもできる。ただし、その別ユーザのパスワードが必要。

$ su root
Password: ●●●●●●●●
# exit

$ su -c whoami root
Password: ●●●●●●●●
root

システム管理者での作業は、危険な命令も実行できる状態なので、作業ミスを減らすためにプロンプトが、# に切り替わる。

ただし、su コマンドは、切り替えるユーザのパスワードが必要である。システム管理作業を複数人で行う場合、管理者パスワードを複数人に教えることになり、セキュリティ的に危険である。

sudo コマンド

そこで、管理者などに登録した人であれば、自分のパスワードで管理者権限を得ることができる sudo (set user do) コマンドを使うのが一般的である。

$ sudo bash
Password: ●●●●●●●● 自分のパスワード
# exit
$ sudo whoami     # 管理者で whoami を実行
root

$ sudo -u foobar  # ユーザ foobar に変更
$ whoami
foobar
$ exit
$ whoami
tsaitoh

システム管理者になれるユーザの設定は、/etc/sudoers に記載されている。一般的に、sudo グループに所属していれば、管理者になれるように設定されていることが多い。

su id bit / スティッキービット

パスワードを変更するpasswdコマンドでは自分のパスワードを変更でき、/etc/passwd や /etc/shadow が書き換えられる。unixのr,w,xの権限だけの知識だと、通常ユーザ自身がpasswd,shadowファイルを書き換えられるのなら、同じファイルに記録されている他のユーザ情報(特にパスワードを変更できるはずである。であれば、他人のパスワードも変更できてしまうのではないのか? 当然、こんなことはできてはいけない。

実は、一時的に他のユーザ権限を借りて作業をするため(システム管理者の権限を借りて作業するため)に、su id bit (スティッキービット)という属性がある。

$ sudo bash
$ passwd
Password: ●●●●●●●
Re enter Password: ●●●●●●●

$ which passwd
/usr/bin/passwd

ls -al /bin/ls
-rwxr-xr-x 1 root root 138856  8月  7  2019 /bin/ls
$ ls -al /bin/passwd
-rwsr-xr-x 1 root root  63960  2月  7 23:54 /usr/bin/passwd

上記の passwd コマンドでは、ファイル属性が – rws r-x r-x となっている。(通常の ls コマンドでは、– rwx r-x r-x となっている。)

su id bit が ON になっているコマンドは、一時的に そのファイル所有者 (/usr/bin/passwd の所有者は root) の権限を借りて命令を実行できる。

ただし、スティッキービットが ON だと、管理者権限で命令を実行することができるが、そのコマンドに不備(脆弱性)があると、システムを乗っ取るためにクラッカーが悪用する場合がある。

((( suid ビットが ON のファイルを探す )))
$ find /usr/bin -perl /u=s -print
/usr/bin/password

リモート作業

ネットワークを越えて命令を実行するには、telnetrshssh コマンドを使う。telnet や rsh コマンドは、通信内容が暗号化されていないため、パケットキャプチャを使われると、パスワードなどを盗むこともできるため、通常は使ってはならない。

telnet (暗号化なしのリモート接続)

$ telnet remote-host   # remote-host という名前のコンピュータに telnet で接続
login: ユーザ名
password: パスワード
$ exit

ssh (暗号化されたリモート接続)

ssh は、通信内容を暗号化して安全にリモートコンピュータで命令を実行するコマンド。リモートコンピュータへの接続(slogin)、リモートコンピュータで命令の実行(ssh)、リモートコンピュータとのファイル転送(scp) などができる。

$ slogin remote-host   # 別コンピュータにlogin
Password: ●●●●●●●●
$ hostname             # 使っているコンピュータ名を調べるコマンド
remote-host
$ exit

$ slogin foobar@remote-host  # 指定したユーザ名(foobar)で接続
Password: foobarのパスワード
$ whoami
foobar
$ exit

$ ssh remote-host ls   # remote-host 上で ls を実行
Maildir

$ ssh foobar@remote-host whoami
foobar

$ scp test.c remote-host:~
  # ファイル test.c を remote-host のホームディレクトリにコピー(アップロード)

$ scp foobar@remote-host:hoge.txt dest-dir
  # リモートホストの hoge.txt を、dest-dir にコピー(ダウンロード)

ネットワークサービスとポートスキャン

外部からネットワーク接続を受けて、どういった処理を実行するようになっているのかを知るための方法を説明する。

ポート番号

ネットワーク通信では、通信する相手を指定するために IP アドレスが用いられるが、サーバでは、複数のプログラムが動いており、どのプログラムと接続するのかを指定するには、ポート番号を用いる。

IPアドレスを電話番号に例えるならば、ポート番号は内線電話番号に相当する。

特に、サーバではクライアントからの通信を待つために、このサービスならばこのポート番号を使うという標準番号が決まっている

SSH    = 22   # リモート接続(暗号化)
TELNET = 23   # リモート接続
SMTP   = 25   # メール送信
DNS    = 53   # DNSサービス
HTTP   = 80   # Web サーバ
POP    = 109,110 # メール受信
IMAP   = 143  # メール受信
HTTPS  = 443  # Web サービス(暗号化)
SMTPS  = 465  # メール送信(暗号化)
IMAPS  = 993  # メール受信(暗号化)
POPS   = 995  # メール受信(暗号化)

ネットワークサービス

サーバでは、クライアントからの接続の受信を待つために、あらかじめプログラムを起動しておく必要がある。
こういうサーバプログラムは、Linux の世界では デーモン と呼ぶことも多い。

ネットワークサービスを起動する方式には、いくつかの方法がある。

スーパーサーバを使う場合

ネットワーク処理のプログラムは、複雑な処理を行うためそのプログラムを起動しておくと、メモリを大量に使用する。古いコンピュータでは、処理速度の低下となるため、利用頻度の低いサーバは、汎用的なサーバを起動しておき、必要に応じてプログラムを起動する。この方法には、inetd とか xinetd が用いられる。

$ vi /etc/inetd.conf
echo stream tcp nowait tsaitoh コマンド名

上記の例では、echo=7番ポート に tcp で接続すると、ユーザ名 tsaitoh の権限で、コマンド名を実行してくれる。

デーモンを起動しておく場合

Linux では ランレベル という状態が決められている。

  • シングルユーザモード(S) – 管理者が作業中で他のネットワーク接続とかを受け付けない状態
  • システム停止(0) – 他の状態からシステム停止に移るための仮想的なランレベル
  • マルチユーザモード(2) – 複数のユーザの接続ができる状態
  • GUI環境付きのマルチユーザモード(5) – X11ディスプレイマネージャが動く状態
((( /etc/inittab の中に以下の記載がある )))
$ cat /etc/inittab
:
# The default runlevel.
id:2:initdefault:
:

$ runlevel   # 現在のランレベルを確認する方法
N 5

sysv-rc 方式

Linux では、ランレベルを変更する init コマンド(init 0 を実行すると、システムを停止できる)を実行すると、

  • /etc/rc移行元ランレベル.d 配下のKで始まるプログラムをファイル名順に実行する。
  • /etc/rc移行先ランレベル.d 配下のSで始まるプログラムをファイル名順に実行する。
$ ls /etc/rc2.d
K01aprx                         S17sudo
K01onedrive                     S17unattended-upgrades
README                          S17uuidd
S01lvm2-lvmpolld                S18acpid
S01pulseaudio-enable-autospawn  S18amavis
S14nfs-common

$ sudo /etc/init.d/apache2 start   # apache2のサーバ起動
$ sudo /etc/init.d/apache2 stop    # 停止
$ sudo /etc/init.d/apache2 restart # 再起動

systemd 方式

上記の sysv-rc 方式は、プログラムの起動スクリプトが shell で書かれているので、(システムが単純な頃は)メンテナンスが容易だったが、(システムが複雑になると)起動処理に時間がかかるのが問題となった。このため、新しい Linux では、systemd というプログラムでサーバを起動する方式にかわった。

$ ls /etc/systemd
journald.conf  network        pstore.conf    sleep.conf  system.conf     user
logind.conf    networkd.conf  resolved.conf  system      timesyncd.conf  user.conf

$ sudo systemctl list-units        # systemd のユニット一覧

$ sudo systemctl list-sockets      # 使用中のソケット一覧

$ sudo systemctl status apache2    # systemd で起動している特定のサーバの状態確認

$ sudo systemctl start   apache2   # systemd でサーバ起動
$ sudo systemctl stop    apache2   # systemd でサーバ停止
$ sudo systemctl restart apache2   # systemd でサーバ再起動

起動中のプログラムの確認

システムが通常状態で起動しているプログラムを確認するには、ps ax を用いる。

$ ps ax    # a 全プロセス表示 x 端末を持たないプロセスも表示
    PID TTY      STAT   TIME COMMAND
      1 ?        Ss     2:57 /sbin/init
      2 ?        S      0:00 [kthreadd]
      :
2229038 ?        S      0:03 /usr/sbin/apache2 -k start
      :

PIDがプロセス番号、STATは、S:処理待ち状態、R:実行状態、TIME欄は、のべ実行時間を表す。

各プロセスの親プロセスと子プロセスの関係が知りたい場合には、pstree コマンドを用いる。

$ pstree
systemd-+-/usr/sbin/amavi---2*[/usr/sbin/amavi]
        |-/usr/sbin/apach---11*[/usr/sbin/apach]
        |-ModemManager---2*[{ModemManager}]
        |-NetworkManager---2*[{NetworkManager}]

ここで、見たことのないプログラムが動いている様なら、システムの進入を受けた可能性を疑わないといけない。

ネットワーク通信で受信待ちのプログラムの確認

Linuxで開いているポートを確認するためには、netstat コマンドを用いる。

$ sudo netstat -ltup4
  # -l Listenポート、-t TCP、-u UDP、-p ポートを開いている、-4 IPv4
稼働中のインターネット接続 (サーバのみ)
Proto 受信-Q 送信-Q 内部アドレス     外部アドレス  状態        PID/Program name    
tcp       0     0 localhost:3551  0.0.0.0:*  LISTEN      841/apcupsd         
tcp       0     0 0.0.0.0:imaps   0.0.0.0:*  LISTEN      418280/dovecot  
:

nmap でポートスキャン

netstat コマンドは、対象コンピュータを使っている時には有効だが、他のコンピュータを調べるには、ポートスキャン専用の nmap を使うのが一般的。
ポートスキャンとは、相手のコンピュータに接続するポート番号を変更しながら、通信可能か調べること。

$ sudo nmap localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2020-02-17 14:45 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000090s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 982 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
25/tcp    open  smtp
:

nmap で調べるための様々なオプション

$ sudo nmap -A localhost  # OSなどを調べる

$ sudo nmap -p 1-1023 localhost # 1〜1023 までのポート番号を調べる

$ sudo nmap -sU localhost  # UDPのポートスキャン

$ sudo nmap -O localhost   # OSの検出

攻撃を受けているのであれば、wireshark などのパケットキャプチャを使って、パケットの中身を調べる必要がある。

検索 🔎

  My Google     Yahoo

便利サイト