AlmaLinux Djungoインストールからサービス開始まで
[環境] OS:AlmaLinux release 8.5 (Arctic Sphynx) python:Python 3.6.8
インストール前準備
ソフトアップグレード
$ sudo dnf check-update $ sudo dnf upgrade-minimal
Django をインストール
$ sudo pip3.6 install 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にする理由
REJECTにする理由
- DROPでもREGECTでも、firewallがあることはアタッカーにわかってしまう。
- 正規のユーザにとってDROPされると時間が掛かって迷惑だから、REGECTですぐに反応を返すべき
- アクセス者がDROPされて接続がうまくいかないとき、どうせリトライするからサーバの転送量はREJECTと変わらない
REJECT --reject-with tcp-reset とは
アクセスに対して unreachable なのを伝えないことで、そのポートで何も listen していないかのように振る舞える
選択肢
- DROP:相手に時間を掛けさせたい場合
- REJECT --reject-with tcp-rest:無反応 相手に情報を渡さないのはtcp-restの方がDROPより優れている
- FORWARD:DROPもREJECTもしないで自然な様子を振舞う
結論
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コマント゛を利用することが推奨されている。