Note to Self

公開する緊張感で、読み返した時に??にならない自分用メモです

AlmaLinux Djungoインストールからサービス開始まで

[環境]  OS:AlmaLinux release 8.5 (Arctic Sphynx)  pythonPython 3.6.8

インストール前準備

ソフトアップグレード
$ sudo dnf check-update
$ sudo dnf upgrade-minimal
Django をインストール
$ sudo pip3.6 install django
Django開発用ディレクトリを作成

ディレクトリ名「django」として作成

$ mkdir django

プロジェクトの作成

プロジェクト名「first」として作成

Django開発用ディレクトリに移動
$ cd django
プロジェクトを作成
$ django-admin startproject first
$ cd first
開発用サーバの起動
$ python3.6 manage.py runserver
起動確認

ブラウザで「127.0.0.1:8000」へアクセス

開発用サーバ終了

「Ctrl」+「c」

[ 追記 ]

VirtualBox内で起動させてdjangoにホストPCから接続する

ゲストOS ファイヤーウォールの停止
djangoプロジェクト内の設定ファイルを変更
$ sudo vi ./django/first/first/settings.py

ALLOWED_HOSTS = []
 ⇩ 変更(ゲストOSのIPアドレスを指定)
ALLOWED_HOSTS = ["192.168.100.10"]
開発用サーバの起動
$ python3.6 manage.py runserver 192.168.100.10:8000

Almalinux8.5にpython3.10をインストール

現在のpythonのバージョンが3.6.8だったので、3.10に変更してみる

最新のPythonをインストールする

Python3.10のビルドに必要な依存関係をインストール
$ sudo dnf install gcc openssl-devel bzip2-devel libffi-devel zlib-debel wget make
最新のPythonを取得
sudo wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tar.xz
アーカイブを抽出
$ sudo tar -xf Python-3.10.0.tar.xz
ソースディレクトリに切り替えて構成スクリプトを実行

このスクリプトは、インストールが機能するためにすべての依存関係が存在することを確認するための事項チェックリストを実行する

$ sudo cd Python-3.10.0 && ./configure --enable-optimizations
ビルドの開始
  • システムにあるコアの数を確認
$ sudo nproc
2
  • ビルドプロセスを開始
$ sudo make -j 2
Python3.10をインストール

altinstall デフォルトの代わりに install デフォルトのPython3バイナリファイルを上書きする

$ sudo make altinstall
インストールのバージョンをチェック
$ python 3.10 --version
Python 3.10.0

テスト仮想環境を作成する

Python の venvモジュールは仮想環境。それにインストールされているPythonインタープリター、ライブラリ、スクリプトは、他の仮想環境で確立されているものから分離されているPython環境。 Python3.10が正しくインストールされ、機能していることを確認するには、簡単なPythonプロジェクトを作成。

プロジェクトディレクトリを作成し、そのディレクトリに移動
$ mkdir ~test_app && cd ~/test_app
プロジェクトのルートディレクトリ内で、コマンドを実行し仮想環境を作
$ python3.10 -m venv test_app_venv
仮想環境をアクティブ化
$ source test_app_venv/bin/activate
シェルプロンプトターミナルが表示される
(test_app_venv) [*****@*** test_app]$
パッケージマネージャーであるpip3.10をインストールする

pip3.10は、Pythonで最も使用されているパッケージマネージャー インストールをテストするチュートリアルでは、Apache-Airflowがインストールされる

$ pip3.10 install apache-airflow
pip3.10を使用してテストアプリケーションを削除
$ pip3.10 uninstall apache-airflow
...
Proceed (Y/n)? y
  Successfully uninstalled apache-airflow-2.1.4
y
仮想環境を終了するコマンド
$ deactivate

iptablesは DROP , REJECT or --reject-with tcp-rest

Fail2banの設定をしていて、BAN後の処理に迷ったのでメモ

DROP / REJECT 基礎知識

DROPにする理由

  • DROPして何も情報を渡さないほうが良い
  • DROPの方がアタッカーの時間が掛かる
  • REGECTで何度もアクセスされて反応を返すとサーバーの転送量が増える

REJECTにする理由

  • DROPでもREGECTでも、firewallがあることはアタッカーにわかってしまう。
  • 正規のユーザにとってDROPされると時間が掛かって迷惑だから、REGECTですぐに反応を返すべき
  • アクセス者がDROPされて接続がうまくいかないとき、どうせリトライするからサーバの転送量はREJECTと変わらない

REJECT --reject-with tcp-reset とは

アクセスに対して unreachable なのを伝えないことで、そのポートで何も listen していないかのように振る舞える

  • DROPでもREJECTでも"filtered"なのはアタッカーに分かってしまう
  • REJECTtcp-resetならポートが閉じている状態と同じ反応を返す

選択肢

  • DROP:相手に時間を掛けさせたい場合
  • REJECT --reject-with tcp-rest:無反応 相手に情報を渡さないのはtcp-restの方がDROPより優れている
  • FORWARD:DROPREJECTもしないで自然な様子を振舞う

結論

今回は、 REJECT --reject-with tcp-restで運用してみる

Alma Linux:nftables Fail2ban インストール

nftablesで運用しているAlma Linux release 8.4に、Fail2banをインストールしてみる

Fail2banとは

起動すると各種設定ファイルを読み込んだ上で、デーモンプロセスとして常駐し、 ログファイルを監視し続ける、Pythonで書かれたスクリプト。 ログを監視し、定義した条件のログが発生するとBAN、定義した時間がが過ぎるとUNBANを自動で実行する。 Fail2ban自体に遮断機能はないが、iptablesやfirewalldと連携し、自動で遮断と解除を行う。

Fail2ban インストール

epel-releaseパッケージをインストール

*Fail2banは、epelリポジトリにある

$ sudo dnf -y install epel-release

インストールしたバージョンの確認

$ fail2ban-server --version
$ fail2ban-client --version
$ fail2ban-regex --version
$ fail2ban-python --version

設定ファイル構成

/etc/fail2ban/
├── action.d
│ ├── dummy.conf
│ ├── hostsdeny.conf
│ ├── iptables.conf
│ ├── mail-whois.conf
│ ├── mail.conf
│ └── shorewall.conf
├── fail2ban.conf
├── fail2ban.local
├── filter.d
│ ├── apache-auth.conf
│ ├── apache-noscript.conf
│ ├── couriersmtp.conf
│ ├── postfix.conf
│ ├── proftpd.conf
│ ├── qmail.conf
│ ├── sasl.conf
│ ├── sshd.conf
│ └── vsftpd.conf
├── jail.conf
└── jail.local

バージョンアップ時に設定を上書きされないよう.localファイを作成 Fail2ban起動時に設定ファイル「.conf」をロードした後、作成したユーザ定義「*.local」ファイルをオーバーライドする。

$ sudo cp -p fail2ban.conf fail2ban.local
$ sudo cp -p jail.conf jail.local
ファイル名 説明
fail2ban.conf 全般設定 ログの格納場所やログレベルを指定
filter.d/*.conf 正規表現を使ってアクセス違反を定義(監視対象)
action.d/*.conf アクセス違反が発生したときの動作を定義
jail.conf 監視するサービスとログファイルの設定。どの程度
(時間、回数)アクセスがあったらブロックするかを定義
jail.local デフォルト設定値を書き換える
サイト毎の設定はこのファイルで指定

jail.localの編集

[INCLUDES]セクション

どのログパスを読むかを指定。 Alma Linuxの場合fedora

before = paths-fedora.conf

[DEFAULT]セクション

Fail2banの基本動作を定義 ここで定義した動作は、後述のMW毎のセクションでオーバライド可能

ignoreip

Fail2banが除外するホストを定義 IPアドレス、CIDRでのマスク、DNSホスト名で定義可能 複数ホストを指定する場合はスペース区切り

ignoreip = 127.0.0.1/8

bantime

BANする期間を定義

bantime = 1d

DEFALT.findtime / DEFAULT.maxretry

findtimeの期間中に、maxretryの回数ログイン試行が失敗した場合にBANする

findtime = 1h maxretry = 5

backend

ログを監視するバクエンドモジュールの指定 pythonモジュールpyintifyを利用したりsystemdのjounalctlを利用するなど様々な方法がある

backend = auto

usedns

各ログにホストネームにてアクセスログが記載されていた場合、IPアドレスを逆引きするかどうかを指定 firewalldやそのバックのiptablesは、ホスト名でのアクセス制御を行うことができないため、IPアドレウsの情報は必須 ログにホストネームしか記載がなかった場合、それをIPアドレスに解決しないといけないが、ホストネームは詐称可能なため、大量のアクセスがあった場合、名前解決を行うだけでDoSになってしまう。

設定コマント゛ 説明
yes 逆引きする
warm 逆引きするが警告をログに残す
no 逆引きを行わずBANも行わない。情報のみ残す
raw ホスト名が関係ない(ユーザ名のみを見るなど)フィルタ/アクションの際に指定

usedns = warm

noが一番性能が良いが、ホストネームでアクセスしてきた場合に全くBANできないので、 Fail2banを利用するサービスのログにはホスト名を記載しない設定にし、usednsをnoにする。

enabled

Fail2banを有効にするかどうか DEFAULTセクションでは無効にしておき、有効化するサービスのセクションで有効に上書きするのが良い

enabled = false

banaction / banaction_allports

BANを行う時のアクションの基本を定義 実際は、アクション定義ファイルにて「メールを発報しログに書いてBAN」など細かく書いてあり、ここで、この実際のBANをどうやるか指定 デフォルトでは、iptablesがBANを実施する設定になっている。

banaction = iptables-multiport banaction_allports = iptables-allports

CentOS7以降、iptablesをfirewalldがラッピングしており、iptablesは起動していないのでfirewalldがBANを行うよう設定する。その設定は、jail.d/00-firewalld.confに記載があり、ここでfirewalldに上書きされるので、jail.localでの設定変更は不要

$ sudo vi 00-firewalld.conf
# This file is part of the fail2ban-firewalld package to configure the use of # the firewalld actions as the default actions. You can remove this package # (along with the empty fail2ban meta-package) if you do not use firewalld [DEFAULT] banaction = firewallcmd-rich-rules[actiontype=] banaction_allports = firewallcmd-rich-rules[actiontype=]

*firewallcmd-rich-rulesは、/etc/fail2ban/actions.d/ 内にある

loglevel

ログレベルの設定 不要なログが多くなるため、初期値の"INFO"から"NOTICE"に変更

loglevel = NOTICE

NWの設定

[ sshd ]
enabled

サービスを利用するかどうか指定 enabled = true # enabled = False ※利用しない場合

filter ※必須

基本的にセクション名(今回はsshd)と同盟のフィルタが、filter.d/に存在していれば、それが使用される それ以外にフィルタを追加したい場合はこのディレクティブを使う

port

BANを行うポート番号 デフォルトでssh(22)が定義されている。 複数必要な場合は、カンマ区切りで列挙。転んで連番を指定。 UDPを指定したい場合は、portではなくprotocolというディレクティブで別に定義

port = ssh,2222
#port = 0:65535 #全ポート遮断したい場合

logpath

監視を行うshdのログのパス この変数はpaths-common.confで定義

banaction / actionの違い
banaction

BANのアクションを指定 /etc/fail2ban/action.d内の設定ファイルを指定

action

jail.localで定義したデフォルトのBANアクションをサービスにより異なるものにしたい場合指定 指定しない場合は jail.local で指定したアクションが実行される

Fail2ban 起動 / 設定変更後

Fail2ban起動

$ sudo systemctl start fial2ban

Fail2ban自動起動ON

$ sudo systemctl enable fail2ban

Fail2ban再起動 *設定変更後

$ sudo systemctl restart fail2ban

動作確認

コマンド 説明
fail2ban-client 動作確認
fail2ban-client status 監視しているサービスを確認
fail2ban-client status [サービス名 ] BAN状況を確認

BANの解除

fail2ban-client set [Jail名] unbanip [IPアドレス]
systemctl restart fail2ban
BAN解除後、再起動せずUNBAN可能だった

BAN結果通知 REGECT / DROP

デフォルト:REGECTのため通知されてしまうので、DROPに変更

$ sudo vi /etc/fail2ban/action.d/iptables-common.conf
blocktype = DROP

AlmaLinux リポジトリ

EPEL

Fedora プロジェクト発 RHEL 用にビルドされたスペシャルパッケージを提供

EPELをインストール

$ sudo dnf -y install epel-release

EPEL設定変更

$ sudo vi /etc/yum.repos.d/epel.repo 


[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
#baseurl=https://download.fedoraproject.org/pub/epel/$releasever/Everything/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-$releasever&arch=$basearch&infra=$infra&content=$contentd
ir
enabled=1
priority=10
gpgcheck=1
countme=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8

priority=10追記 優先度を指定 1-99 を指定可, 1 が最優先, 未指定の場合のデフォルトは 99

ELRepo

RHEL 用の各種ドライバーを主に提供

ELRepoをインストール

$ sudo dnf -y install elrepo-release 

ELRepo設定変更

$ sudo vi /etc/yum.repos.d/elrepo.repo 

[elrepo]
name=ELRepo.org Community Enterprise Linux Repository - el8
baseurl=http://elrepo.org/linux/elrepo/el8/$basearch/
        http://mirrors.coreix.net/elrepo/elrepo/el8/$basearch/
        http://mirror.rackspace.com/elrepo/elrepo/el8/$basearch/
        http://linux-mirrors.fnal.gov/linux/elrepo/elrepo/el8/$basearch/
mirrorlist=http://mirrors.elrepo.org/mirrors-elrepo.el8
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org

リポジトリの有効化

リポジトリの設定ファイルがインストールされているか確認

sudo yum repolist all | grep -i epel

epel                           Extra Packages for Enterprise Linux 8 -  disabled
epel-debuginfo                 Extra Packages for Enterprise Linux 8 -  disabled
epel-modular                   Extra Packages for Enterprise Linux Modu enabled
epel-modular-debuginfo         Extra Packages for Enterprise Linux Modu disabled
epel-modular-source            Extra Packages for Enterprise Linux Modu disabled
epel-playground                Extra Packages for Enterprise Linux 8 -  disabled
epel-playground-debuginfo      Extra Packages for Enterprise Linux 8 -  disabled
epel-playground-source         Extra Packages for Enterprise Linux 8 -  disabled
epel-source                    Extra Packages for Enterprise Linux 8 -  disabled
epel-testing                   Extra Packages for Enterprise Linux 8 -  disabled
epel-testing-debuginfo         Extra Packages for Enterprise Linux 8 -  disabled
epel-testing-modular           Extra Packages for Enterprise Linux Modu disabled
epel-testing-modular-debuginfo Extra Packages for Enterprise Linux Modu disabled
epel-testing-modular-source    Extra Packages for Enterprise Linux Modu disabled
epel-testing-source            Extra Packages for Enterprise Linux 8 -  disabled

リポジトリを有効化 *8系Linux OS

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y

リポジトリを無効化

sudo yum-config-manager --disable epel

パッケージをインストール/アップデートするときだけ有効化

$ sudo dnf --enablerepo=epel install <パッケージ名>

PAM認証の仕組み

PAMとは

PAM [Pluggable Authentication Modules]

  • Linuxやアプリケーションでユーザ認証を行うためのAPI
  • 個々のアプリケーションから独立して、ライブラリや各種モジュールを備えLinuxOSやアプリケーションは、PAMを利用することでユーザ認証を行うことができる

PAM関連ファイル

設定ファイル

/etc/pam.d 配下に保存

構成
  [module interface] [control flag] [module name] [module arguments]

  第一パラメータ:モジュールタイフ゜
  第二パラメータ:処理制御フラグ
  第三ぷらメータ:実行モジュール

module interface (PAMモジュールインターフェース: 第一パラメータ)

モジュールタイフ゜ 説明
auth ユーザ認証(パスワードの検証)
認証の許可、認証の方法などに関するモジュール
account アクセスが許可されたかを確認
アカウント有効期間や有効性に関するモジュール
password ユーザのパスワード変更
パスワードの設定、確認に関するモジュール
session ユーザセッションの設定・管理
|ユーザセッションを設定、管理に関するモジュール

ユーザ認証の流れ
「auth」でユーザの確認が成功
  ↓
「account」でアカウントの有効性が確認される
  ↓
「password」でパスワードを確認
  ↓
「session」で接続許可するパスを確認

control flag (制御フラグ 第二パラメータ)

処理制御フラグ 説明
required このモジュールが成功しないと全体は認証されない。ただし失敗しても、後続に実行予定のモジュール処理が全て終わるまでは、利用者に結果が通知されない。
requisite このモジュールが成功しないと全体は認証されない。失敗した時点で次を参照すること無くエラーになる。先にrequiredが失敗していればrequired。このフラグで初めて失敗すればrequisiteエラーになる。
sufficient 他のモジュールが成功し、このモジュールも成功すると、移行のモジュールは参照せず認証される。失敗した場合optionalエラーになる。
optional 他に参照すべきモジュールがない場合だけ、認証成功のために便宜的に必要となるフラグ。その他のモジュールがある場合は無視される。
include モジュール結果の処理は関係しないフラグ。第三パラメータで指定されたPAMモジュールの内のパラメータのうち、第一パラメータで指定されたモジュールタイフ゜と合致するもの全てを、パラメータに追加する。
substack includeとほぼ同じだが、includeでは第三パラメータで指定したPAMモジュールの記載内容をそのまま持ってくるだけなのに対し、substackでは指定したPAMモジュール内で処理を実行し、結果だけをもってくるという違いがある。

include 例)
 /etc/pam.d/login にいかが記載されていた場合
 session include system-auth
system-authというPAMモジュールファイルに記載のある各行のうち、モジュールタイフ゜がsessionの行すべてを、/etc/pam.d/loginにも適用するという意味。

module name (モジュール名)
  • 64bitの場合:/lib64/security にあるモジュールを指定
  • 32bitの場合:/lib/security にあるモジュールを指定

module arguments (モジュールの引数)

  • ユーザIDが何番以上
  • 再度パスワードを要求
  • パスワードなしでも許可

PAMファイル設定の注意点

設定ファイルの直接編集は非推奨。 authconfigコマント゛を利用することが推奨されている。