masakazu-takewakaのブログ

たまに書きます。

「まんがでわかるLinux シス管系女子3」を読んだ

読んだので軽くメモ。

https://www.amazon.co.jp/dp/B07CM2YNVD/ref=cm_sw_r_tw_dp_U_x_8b9nEb3ZHTFF5

特定のポートでのみ通信を許可する

ファイアウォール・・・許可された通信以外を遮断する仕組み。今回のこれはパケットフィルター。

Ubuntuにはufwというツールがありこんな風に使う。

$ sudo ufw default deny # まず全て遮断する
$ sudo ufw allow 22        # 通信を許可したいポートだけ個別で許可
$ sudo ufw allow 80
$ sudo ufw enable           # 有効果
$ sudo ufw status            # チェック

踏み台の向こうのサーバーに直接ファイルをコピーする

ポートフォワーディングすれば手元のマシンのポートと踏み台の向こうのサーバーのポートの間で直接通信が行われる。(漫画はコピーしたいファイルが大きすぎて踏み台のディスク容量が不足してたところをポートフォワーディングで直接通信させて解決、という流れ)

# ポートフォワーディングする(手元 - コピー先)
$ ssh -L take@踏み台ip 50022(適当):コピー先ip:22
# 手元のマシンから直接コピー(トンネルの入り口があるlocalhostをコピー先に指定)
$ scp -p 50022 fuga/hoge.txt take@localhost:/tmp

誰がそのポート番号を使っているのか知りたい

lsof... ofはOpen Files。プロセスが開いているファイルや、ファイルを開いているプロセスを調べるのに使われる。

$ lsof -i :3000

COMMAND   PID             USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    16873 masakazutakewaka   12u  IPv4 0x150e6b95224251b3      0t0  TCP localhost:hbci (LISTEN)
ruby    16873 masakazutakewaka   13u  IPv6 0x150e6b951d1cfa73      0t0  TCP localhost:hbci (LISTEN)

逆にプロセスが使っているポート番号を調べる。

$ lsof -p 16873 | grep LISTEN

ruby    16873 masakazutakewaka   12u  IPv4 0x150e6b95224251b3      0t0         TCP localhost:hbci (LISTEN)
ruby    16873 masakazutakewaka   13u  IPv6 0x150e6b951d1cfa73      0t0         TCP localhost:hbci (LISTEN)

誰がネットワークの帯域を使っているのか調べたい

  • どのプロセスがどれくらい帯域を使っているのかが知りたければnethogs
  • 誰との通信で帯域が使われているのかが知りたければiftop

管理者権限で行われた捜査の履歴を辿りたい

auth.logを見る。 Ubuntuだと/var/log/auth.log

管理者権限の操作に必ずsudoが付くように、rootアカウントを無効化する。

# passwdにlockオプションをつけるとそのアカウントにログイン出来なくなる
$ sudo passwd --lock root

sshの総当たり攻撃を締め出したい

漫画ではfailregexに認証失敗を締め出す正規表現を追加していたが、僕の環境(Ubuntu18.04, fail2ban0.10.2)では/etc/fail2ban/jail.confに以下の記述があった。

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode   = normal

いう通りに/etc/fail2ban/jail.localを作成。 実験したいだけなので締め出し期間は1分。

[sshd]
mode   = aggressive
bantime = 1m

デーモンを再起動して、sshで何回か意図的に認証失敗してみたら、きちんと締め出された。

# 検証用に用意した仮想マシンの中
$ sudo systemctl restart fail2ban

# ホストマシンでsshの認証失敗を数回

# 検証用に用意した仮想マシンの中
$ sudo fail2ban-client status sshd

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 6
|  `- File list:    /var/log/auth.log
`- Actions
   |- Currently banned: 0
   |- Total banned: 1
   `- Banned IP list:

なぜデフォルトで締め出しの設定がないのかというと、fail2banが本来弱いパスワード認証に対する締め出しに使われるもので、ssh認証の諦めメッセージConnection closed by...はログを溢れさす以上のことはしないかららしい。(?)

管理者権限が必要な操作を一部許可する

/etc/sudoersを編集する。開くとThis file MUST be edited with the 'visudo' command as root.とあるので、visudoで編集する必要がある。visudoはバリデーションが効く。

シンタックスユーザー名 この設定が有効なIP=(なり変われるユーザー:なり変われるグループ) 実行を許可するコマンド。 ()内は(ALL)の様にグループを省略可能で、「なれるグループなし」という意味になるが、sudo -gはあまり使われないので問題なしとのこと。

自分に対して管理者権限でのpasswdsuを禁止してみる。

# /etc/sudoersに以下の様に書かれているので新たにファイルを作成する
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
$ sudo visudo -f /etc/sudoers.d/take

# /etc/sudoers.d/takeの中
take ALL=(ALL:ALL) ALL, !/bin/su, !/usr/bin/passwd

# 1番下の設定の優先順位が1番高い
$ sudo -l
Matching Defaults entries for take on take-VirtualBox:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User take may run the following commands on take-VirtualBox:
    (ALL : ALL) ALL
    (ALL) ALL, !/bin/su, !/usr/bin/passwd, !/bin/ls

# suとpasswdがsudoで実行できなくなっていることを確認
$ sudo su
Sorry, user take is not allowed to execute '/bin/su' as root on take-VirtualBox.
$ sudo passwd
Sorry, user take is not allowed to execute '/usr/bin/passwd' as root on take-VirtualBox.

その他

  • トンネルを掘る時は最終地点から初期地点までの道を考える
  • sshはgオプションでトンネルを他のマシンにも開放する
    • e.g.) PCでトンネル掘ってスマホで接続
  • トンネルを自動復旧するautosshというコマンドがある
    • tmuxを使わなくてもいい?
  • ファイルの同一性を確かめるだけならmd5で事足りるが、そのファイルが外から来たものであれば必ずsha256などの安全なハッシュ関数を使う