情報技術」カテゴリーアーカイブ

MicrosoftのHigh Volume Emailを使う

現在ベータで提供されているMicrosoft 365のHigh Volume Emailの設定を行います。

Security Defaultsを無効化する

Microsoft Entra admin centerにて、Security defaultsを無効化し、
Conditional Accessを代わりに利用するようにします。

Entra admin centerのIdentityセクションにあるOverviewを選択し、
Propertiesタブを開きます。

一番下にSecurity defaultsの設定がありますので、ここから無効にしてください。
無効にする際に、Conditional Accessを代わりに利用する設定にすることを推奨します。

また、削除理由にHigh Volume Emailを使うためであることを記述すると、
将来的にMicrosoftが何かしらの方法を作ってくれるかもしれません。
是非記述しましょう。

詳しい設定の意味等はMicrosoft DocsのSecurity defaults in Microsoft Entra IDに記述されています。

High Volume Emailを利用するアカウントのグループを作成

次のConditional Accessで例外設定をするためにMicrosoft Entra admin CenterでSecurity Groupを作成します。

High Volume Emailで独自のメールドメインから送信する場合は、
下記のMembership ruleがそのまま利用できます。

(user.mail -contains "@domain.to.use.invalid")

このルールはセキュアでは無いことに注意してください。
本来であればendsWith等で明示的にこのメールがドメイン部であることを示すべきですが、
悲しいことにMembership ruleではstartsWithのみ対応のようです。

もしメールのプレフックスでHVEメールを示す場合は、startsWithでよりセキュアに設定できるでしょう。

下記のコードは動作検証していませんが、おそらく使えるはずです。

(user.mail -startsWith "system.hve.")

Conditional Accessの設定

Security Defaultsの設定画面まで移動すると、
Manage Conditional Accessというリンクが見えるようになっているはずです。
これをクリックし、Conditional Accessの設定に入ります。

本来であればBlock legacy authenticationの例外に先ほど作成したグループを設定すればいいはずですが、
念のためにMultifactor authentication for all usersにも同様に例外設定をし、
同時にStateをReport-onlyに設定しています。

この設定はとても危険ですので、一度例外設定を投入したのち、
しばらく放置して動くか確認すべきです。
もし動いたらIssueページから教えてもらえると助かります。

ドメインの追加

Microsoft Docs – Add a domain to Microsoft 365を参考に、
ExchangeとDKIMの設定を投入したドメインの追加を行います。

ここはおそらくExchangeを使っているテナントの場合は過去に設定している場合がほとんどだと思いますので、特に躓くことなく設定できるかと思います。

また、現在利用しているドメインからそのままメールを送信する場合、この手順はスキップできます。

HVEアカウントの作成

Exchange admin centerのMail flowセクションの中にあるHigh volume mailからHVEアカウントを作成します。

プライマリメールアドレスがメールの送信元になります。
また、同一テナント内に送信する場合は、表示名がFromの表示名より優先されるため、
わかりやすい名前を指定することを推奨します。

AllowBasicAuthSmtpポリシーの適用

Exchange admin centerのCloud Shellで下記のコマンドを実行し、
Exchangeの設定をコマンドでできるようにします。

Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline

最初にAllowBasicAuthSmtpの設定を持つポリシーの作成を行います。
下記のようなコマンドが利用できます。
また、一度ポリシーを作成した後は複数のHVEアカウントや一般のアカウントで使いまわすことができるため、この作業は最初の1回のみで大丈夫です。

New-AuthenticationPolicy -Name "AllowBasicAuthSmtp" -AllowBasicAuthSmtp

作成したHVEアカウントに作成したポリシーを割り当てます。
下記のようなコマンドを実行します。

Set-User -Identity "[email protected]" -AuthenticationPolicy "AllowBasicAuthSmtp"

メーラーへの設定

Microsoft DocsのManage high volume emails for Microsoft 365 Public previewに記述されている接続先をSMTPクライアントに設定します。

日本語版ドキュメントでは、smtp-hve.office365.comとなるべきホスト名がsmtp-have.office365.comと誤訳されているので注意してください。

また、ユーザ名とパスワードは送信元メールアドレスとHVEアカウント作成時に設定したパスワードとなります。

この記事の最後にはエラーコードとその原因が書いてありますので、必要に応じて参照してください。

Windowsの3本指タップをブラウジング向けカスタマイズにする

Windowsの3本指ジェスチャーは標準だとデスクトップを表示や、検索など、人によっては使わないものが多いです。
今回はマウス中ボタンとタブ切り替えに設定し、ブラウジングに便利な設定にします。

3本指タップを設定

Windowsの設定から、「Bluetoothとデバイス」->「タッチパッド」->「3本指ジェスチャー」を開きます。
タップを「Windows Search」から「マウスの中ボタン」に設定すればOKです。

この状態では、下記のショートカットが利用できます。

  • ブラウザでリンクを3本指タップすると新しいタブで開かれます
  • ブラウザのタブを3本指タップするとタブが閉じられます
  • Windowsタスクバーのアプリケーションを3本指タップすると、すでに開かれていても、新しいウィンドウで開かれます

3本指ジェスチャーの設定

Windowsの設定から、「Bluetoothとデバイス」->「タッチパッド」-> 「詳細ジェスチャー」->「3本指ジェスチャーの設定」を開きます。

「上へスワイプ」を「カスタム」に設定し、「記録を開始」を押し、「Ctrl + Shift + Tab」を入力し、「記録を終了」をクリックします。
「下へスワイプ」も同じように設定しますが、「Ctrl + Tab」を入力します。

この状態では、下記のショートカットが利用できます。

  • ブラウザなどのタブが使えるアプリケーションでタブの切り替えがジェスチャーでできるようになります
  • Edgeを縦タブ設定にすることで、直感的に操作できるようになります

FessとnginxでPDFを保管する全文検索可能なサーバを構築する

目的

PDFやdocs,xlsxなどを全文検索できるサーバを構築します。
nginxを使い、データにオンラインでアクセスできるようにします。

環境

  • Ubuntu 22.04 LTS

Nginxのセットアップ

Nginxをインストール

Ubuntuにnginxをインストールします。
server_tokensの設定も行うため、nginx-extrasも同時にインストールします。

sudo apt install nginx nginx-extras

Nginxのグローバル設定

/etc/nginx/nginx.confの20行目付近にあるserver_tokens off;をコメントインし、
nginxのバージョンが公開されないようにします。

Sitesの設定

/etc/nginx/sites-available/datastore.confを以下のように編集します。

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root /var/www/content;

        server_name _;

        add_header  X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";

        autoindex on;
        charset utf-8;

        location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; }

        location / {
                autoindex on;
                allow 192.168.0.0/16;
                allow 172.16.0.0/12;
                allow 10.0.0.0/8;
                deny all;
        }
}

location /allowは適切な社内ネットワークなどを指定してください。
外部に公開する場合はdeny allごとこれらを削除し、
Robots系の設定も削除してください。

/var/www/contentにディレクトリを作成し、PDFなどを入れてください。

サイトを有効化し、デフォルトサイトを無効化します。

sudo ln -s /etc/nginx/sites-available/datastore.conf /etc/nginx/sites-enabled/datastore.conf
sudo rm /etc/nginx/sites-enabled/default

Nginxの再起動

設定を反映させるため、nginxを再起動します。

sudo systemctl reload nginx

OpenSearchのインストールと設定

OpenSearch公式ページからdeb形式でOpenSearchをダウンロードするか、aptリポジトリを追加してインストールします。

おすすめはaptリポジトリを使う方法です。

下記コマンドから必要なプラグインを、インストールしますが、
2.10.0の部分はインストールしたOpenSearchのバージョンに合わせてください。

$ sudo /usr/share/opensearch/bin/opensearch-plugin install org.codelibs.opensearch:opensearch-analysis-fess:2.10.0
$ sudo /usr/share/opensearch/bin/opensearch-plugin install org.codelibs.opensearch:opensearch-analysis-extension:2.10.0
$ sudo /usr/share/opensearch/bin/opensearch-plugin install org.codelibs.opensearch:opensearch-minhash:2.10.0
$ sudo /usr/share/opensearch/bin/opensearch-plugin install org.codelibs.opensearch:opensearch-configsync:2.10.0

最後に/etc/opensearch/opensearch.ymlに下記設定を追記します。

configsync.config_path: /var/lib/opensearch/data/config/
plugins.security.disabled: true

Javaのインストール

Fessのクロールに必要なJavaをインストールします。

FessはUbuntu PackagesのJava JREを使うとクラッシュするため、
Temurinを利用します。

公式ドキュメントを参考に、
apt Repositoryを設定し、temurin-17-jreをインストールしてください。

Fessのインストールと設定

Fessのインストールをする前にFessにい外部からアクセスする必要がある場合、
Fessは標準でIPv6のListenを行います。
もし、IPv4をListenさせたい場合は、
/etc/sysctl.confに下記内容を追記してsysctl -pを実行し、
IPv6をシステムで無効にしてください。

net.ipv6.conf.all.disable_ipv6 = 1

FessはGitHubのリリースからdebパッケージをダウンロードしてインストールします。

wget https://github.com/codelibs/fess/releases/download/fess-14.10.1/fess-14.10.1.deb
sudo apt install ./fess-14.10.1.deb

/usr/share/fess/bin/fess.in.sh内の次の2行をコメントインし、内容も修正します。

SEARCH_ENGINE_HTTP_URL=http://localhost:9200
FESS_DICTIONARY_PATH=/var/lib/opensearch/data/config/

OpenSearchとFessを自動起動させる

systemctlで下記のコマンドを投入し、
サービスを開始させ自動起動を有効にします。

sudo systemctl daemon-reload
sudo systemctl restart opensearch.service fess.service
sudo systemctl enable opensearch.service fess.service

Fessの設定を行う

http://localhost:8080/adminにアクセスし、管理画面に入ります。

初期ユーザはadmin:adminです。

スケジューラー設定

System -> SchedulerにJob Schedulerが存在しない場合があります。
初期で何もない場合は、System Info -> Back UpからGitHubで公開されてる初期設定をインポートしてください。

クロールの設定を行う

公式ドキュメントを参考にクロール設定を追加してください。

このNginx設定例ではrobots.txtでクロールを制限しているため、
Config Parametersに下記の設定を投入してください。

crawler.ignore.robots.txt=true
config.ignore.robots.tags=true
client.robotsTxtEnabled=false

また、必要に応じて、インデックス化する最大のファイルサイズを指定してください。
単位はバイトです。

client.maxContentLength=262144000

クロールの実行

System -> SchedulerからDefault Crawlerを開き、
Start nowをクリックすることでクロールが開始されます。

ジョブの進捗はSystem -> Job Logから、
クロール結果はSystem -> Crawling Infoから確認できます。

内部に蓄積されたインデックス済みファイルは、
System -> Searchで空文字を検索することで閲覧できます。

ログについて

Fessのログは/var/log/fess下に出力されます。

Crawlerを呼ぶ前のログはfess.logに、
Crawler自体のログはfess-crawler.logに保存されます。

Mailjetを使ったメール送信サーバをUbuntu22.04とPostfixで作る

目的

Zabbixなどのメールを配信するサーバをMailjetを使って構築します。
Mailjetを使うことで、OP25Bが行われているプロバイダでもメールを送信できるようにします。

Postfixのインストール

libsasl2-modulesがないと認証で失敗するため、同時にインストールします。

Postfixの設定はNo configで続行してください。

apt install libsasl2-modules postfix 

Postfixの設定

Postfixの設定例です。
実際の拠点で使っているものを記述しているので、
いくつか不要な表記があると思います。
各自で消してください。

relayhost = in-v3.mailjet.com:587
smtp_sasl_auth_enable = yes
smtp_use_tls = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous

command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix/sbin
data_directory = /var/lib/postfix

myhostname = example.com
mydomain = example.com

local_recipient_maps =

mail_owner = postfix

myorigin = $mydomain
smtpd_banner = $myhostname ESMTP

inet_protocols = all
inet_interfaces = all
mynetworks_style = subnet
mynetworks = 127.0.0.0/8

smtpd_relay_before_recipient_restrictions = yes
smtpd_relay_restrictions =  permit_mynetworks, reject_unauth_destination
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

setgid_group = postdrop

message_size_limit = 10485760
mailbox_size_limit = 0
compatibility_level = 3.6

認証情報の設定

/etc/postfix/sasl_passwdは次の内容になります。
ホスト名指定がin-v3ではなくinのみになっていることに注意してください。

in.mailjet.com APIKey:SecretKey

適用

最後にpostmapを実行し、Postfixを再起動します。

sudo postmap hash:/etc/postfix/sasl_passwd
sudo systemctl restart postfix

Mattermostをdocker-composeとCloudflare TunnelでUbuntu Server 22.04上に構築する

はじめに

今回構築するMattermostは下記の構成になります。

  • Port 8065でHTTP Listen
  • Cloudflare Tunnelでリバースプロキシ
  • Callsは利用しない
  • Bleveは利用しない
  • S3は利用しない

このレッスンでは下記の環境を自身で用意してください

  • x64 CPUを搭載したPC (Dockerが動作すること)
  • 上記のPCでDVDもしくはUSBからブートさせる機材
  • DVD-RとDVDドライブもしくは4GB以上のUSBメモリ

このレッスンでは、コンピュータ内のデータが消去されます。
すべての操作は慎重に行ってください。

もしレッスンを行うにあたって不安な場合、
担当者の空き時間をあらかじめ確認し、その時間に合わせてレッスンを行ってください。

Ubuntu Server 22.04のインストール

Ubuntuは2年おきに長期サポート版がリリースされます。
2022年4月にリリースされた22.04が現在の最新リリースであり、
次の長期サポート版は2024年4月リリース予定の24.04です。

この資料では22.04を利用して環境を構築しますが、
基本最新の長期サポート版を利用してください。
長期サポート版はダウンロード時などにLTSと表記されます。
参考にしてください。

Ubuntu Serverのダウンロード

Ubuntu Serverは公式サイトのダウンロードページからダウンロードできます。
Alternative downloadsからTorrentなどでダウンロードすることもできます。
必要に応じて活用してください。

日本のミラーサイトからダウンロードすることもできます。
詳しくはUbuntu Japanese Teamのページを参照してください。

Ubuntu Serverのインストール

基本はUbuntu公式ドキュメント
Server Worldの記事
を参考にするといいでしょう。

サイトと違う点として、
インストールする際にはUbuntu server (minimized)を選択してください。

ネットワークの設定についてはかなり癖があります。
とりあえずDHCPのネットワークで設定を実施してください。
固定IPでの設定は別に記事にします。

OpenSSHサーバは必ずオンにしてください。
これ以降はSSHでの操作を行います。

Dockerを使うと記述していますが、
インストール最後のアプリケーションをインストールする画面では何も選択しないでください。

IPアドレスの確認

インストール時に設定したユーザ名とパスワードでまずPC本体でログインします。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 18:66:da:2f:e1:b4 brd ff:ff:ff:ff:ff:ff
    inet 17.0.0.2/24 brd 17.0.0.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet6 2620:149:af0::10/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 2591920sec preferred_lft 604720sec

ip aコマンドでIPアドレスを確認してください。

基本的にenpethから始まる物が有線LANで、inetの行にIPアドレスが記載されています。
この場合、17.0.0.2がIPアドレスで、/24がサブネットマスクです。

IPv6アドレスも同じようにinet6の行で確認できます。

このIPアドレスをメモしておいてください。

SSHでのアクセス

Windows 10からはSSHクライアントが標準でインストールされています。

SSHコマンドの基本文法は下記のとおりです。

usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command

基本的に使うのは-l, -p, -L, destinationでしょう。

-lはログインするユーザ名、
-pはポート番号、
-Lはポートフォワーディング(本ドキュメントでは利用しません)の設定です。

destinationでは宛先(サーバ)を設定します。

初期設定の場合下記のコマンドでログインできます。

ssh -l 初期設定で作ったユーザ名 サーバのIPアドレス

最初にアクセスする際には下記の表示が出ます。

The authenticity of host 'サーバのIPアドレス' can't be established.
ED25519 key fingerprint is SHA256:ABCDEF0123456789.....
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

yesと入力しEnterを押してください。

その後、パスワードを要求されます。
パスワードの入力時には文字が一切表示されませんが、正常な挙動です。

下記のような画面が出ればログインできています(もっと少ない場合もあります)

Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-53-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.

Last login: Tue Aug  8 01:46:27 2023 from 17.0.3.129
ユーザ名@サーバ名:~$

試しにip aなどのコマンドをうち、
サーバ本体で打った時と同じ値になるか試してみましょう。

基本コマンドについて

基本的なファイル操作などについては、LearningDocsで解説しています。
実際に試してみてください。

下記では、Learning Docsで解説していないコマンドを解説します。

sudo

Linuxにはrootという特権ユーザが存在します。
rootではおおよそ大体の(破壊を含む)すべての行動ができます。
その危険性から、Ubuntuではrootユーザは初期状態で無効化
(パスワードが設定されておらずログインできないユーザ)
になっていますが、特権ユーザとして実行しないといけない処理
(アプリケーションのインストール等)
を行う際にはsudoコマンドを利用し、特権ユーザに成り上がります。

sudoコマンドは下記のように使います。

sudo 特権で実行したいコマンド

例えば、aptコマンドはアプリケーションのインストールやアップデートを行うコマンドですが、
特権ユーザでないと実行できません。

$ apt update # 通常ユーザで実行
Reading package lists... Done
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
W: Problem unlinking the file /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permission denied)
W: Problem unlinking the file /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permission denied)

$ sudo apt update # sudoを使って実行
[sudo] password for ユーザ: # ここでパスワードを入力(一定期間sudoしてないと表示される)
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [109 kB]
Get:4 http://archive.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:5 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [868 kB]
Get:6 http://archive.ubuntu.com/ubuntu jammy-updates/main Translation-en [212 kB]
Get:7 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 c-n-f Metadata [15.6 kB]
Get:8 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [964 kB]
Get:9 http://archive.ubuntu.com/ubuntu jammy-updates/universe Translation-en [209 kB]
Fetched 2,613 kB in 4s (686 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
26 packages can be upgraded. Run 'apt list --upgradable' to see them.

sudoとても危険なコマンドです。
なんでもsudoに頼らず、本当にroot権限が必要か、
そもそも今行おうとしている作業が本当に正しいのかをよく確認してください。
大いなる力には大いなる責任が伴います。

apt

aptはDebian系のLinuxで利用されるパッケージ管理システムです。

基本的には下記の構文で主に利用されます。

$ sudo apt update # パッケージ情報の更新
$ sudo apt upgrade # パッケージの更新
$ sudo apt install パッケージ名 # パッケージのインストール
$ sudo apt remove パッケージ名 # パッケージのアンインストール
$ sudo apt purge パッケージ名 # パッケージの設定ごと削除
$ sudo apt autoremove # 不要なパッケージの削除
$ sudo apt autopurge # 不要なパッケージの設定ごと削除
$ apt search パッケージ名や検索ワード # パッケージの検索

基本的に、aptコマンドで何かしらの作業をする前に、
必ずapt updateを行ってください。

aptコマンドでは、パッケージの情報をローカルに一度保管するため、
ローカルのデータが古いと様々なコマンドが失敗します。

Dockerとdocker-composeのインストール

Dockerはコンテナ型の仮想化技術です。
Kernelレベルでの仮想化を行うため、
仮想化ソフトウェアを利用するよりも軽量で高速に動作します。

また、イメージという概念でアプリケーションの展開を行うため、
とてもめんどくさい環境構築も比較的楽になります。

Docker公式のマニュアルを読むのが一番良いでしょう。

インストールする際は最新のバージョン
(英語的にはLatest Version)をインストールしてください。

Docker Composeも同じように公式ドキュメントを参考にインストールしてください。

最後にインストールできているか確認しましょう

$ docker --version
Docker version 24.0.5, build ced0996

$ docker-compose --version
docker-compose version 1.29.2, build unknown

値が違っても構いません。
エラーが出ていないことを確認してください。

DockerとDocker Composeで遊ぶ

さて、Dockerで遊んでみましょう。

試しに

$ sudo docker run --rm -it ubuntu:latest bash

などと実行し、Ubuntuのイメージを実行してみましょう。

シェルにroot@ランダムな文字列:/#と表示されれば成功です。

この環境はあくまで仮想環境です。
rm -rf /*などを打っても多分大丈夫だと思います(責任は取りません)

exitで抜けましょう。

Docker Composeは少し便利になったDockerです。

通常Dockerでは、ネットワークなどで接続性を用意する場合、
それはもうめんどくさい手順が必要ですが、
Docker Composeでは同一のYamlファイル内のコンテナは
初期状態で同一のネットワークに接続され、Yaml内のキーの名前で名前解決できるため、
DBが必要なアプリケーションの構築などでとても便利です。

Dockerとdocker-composeについて説明しようとするとかなり長くなるので、
詳しくはググるか個別で質問して解決してください。

覚えておくべきこと

Dockerではコンテナとイメージがよく出てきます。
イメージからコンテナが作られ、コンテナ内で様々な事象が起こります。
コンテナは不要になれば破棄できます。

イメージが同じであれば、基本的には同じ内容コンテナが生成されます。

永続化

Volumeを使うと、コンテナの特定のディレクトリやファイルなどを、
現実のシステム上のディレクトリやファイルにマウント(若者的にはリンクとか言った方がいい?)できます。
これにより、コンテナ内のデータを永続化できます。

試してみましょう

あらかじめホストでls /tmpを実行し、中身をなんとなく覚えておいてください。

docker run --rm -it -v /tmp:/hosttmp:ro ubuntu:latest bash

このコマンドでコンテナを構築し、ls /hosttmpを実行すると大体同じ内容になっているはずです。
:roをつけているため、touchなどを実行しようとしても弾かれると思います。

ポート開放

Exposeという概念があります。
Dockerでは標準でネットワークに対しホストのIPでNAPT(e-Worldの解説)されるため、
Exposeを使い明示的にポートを指定してアクセスを許可する必要があります。

例えば、

docker run --rm -it -p 8080:80 nginx:latest

で8080ポートでnginxにアクセスできます。

試しにブラウザでhttp://サーバのIP:8080/にアクセスしてみてください。
Welcome to nginx!が表示されるはずです。

Ctrl + Cの同時押しで終了しましょう。

Mattermostの構築

推奨される手順は公式ドキュメントに記述されていますが、
今回は独自流で進めます。

Mattermost用にディレクトリを作り、その中に移動します。
今後はその中で主に作業を行います。

.envファイルを作り下記の内容にします。
ただし、コメントは削除してください(日本語が不具合を起こすかもしれないので)

# Mattermostを公開するドメインを設定してください。
# cloudflaredで公開できるドメインを設定してください。
DOMAIN=mattermost.example.com

# タイムゾーン設定です
# 日本ならAsia/Tokyoそれ以外は
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
# を参照してください。
TZ=Asia/Tokyo

# PCが再起動した際にどのようにするかの設定です。
# always: 停止されていた場合でも再起動時に起動する
# unless-stopped: 停止されていなければ再起動時に起動する
# on-failure: エラーで停止した場合のみ再起動する
RESTART_POLICY=unless-stopped

# Postgresデータベースのバージョンです。
# https://hub.docker.com/_/postgres
# に書いてある最新のbetaやalphaとついていないバージョンを指定しるとよいでしょう。
POSTGRES_IMAGE_TAG=15-alpine
# Postgresの永続化先です
# このディレクトリを削除するとデータベースが消えます。
POSTGRES_DATA_PATH=./volumes/db/var/lib/postgresql/data

# Postgresのユーザ名、パスワード、データベース名です。
# この値をMattermost側で設定し、MattermostがDBを使えるようにします。
POSTGRES_USER=mmuser
POSTGRES_PASSWORD=mmuser_password
POSTGRES_DB=mattermost

# Mattermostの設定ファイル関連の永続化設定です
MATTERMOST_CONFIG_PATH=./volumes/app/mattermost/config
MATTERMOST_DATA_PATH=./volumes/app/mattermost/data
MATTERMOST_LOGS_PATH=./volumes/app/mattermost/logs
MATTERMOST_PLUGINS_PATH=./volumes/app/mattermost/plugins
MATTERMOST_CLIENT_PLUGINS_PATH=./volumes/app/mattermost/client/plugins
MATTERMOST_BLEVE_INDEXES_PATH=./volumes/app/mattermost/bleve-indexes

# Bleve index (全文検索)の設定です
# いじらないでください。
MM_BLEVESETTINGS_INDEXDIR=/mattermost/bleve-indexes

# 課金している場合は`mattermost-enterprise-edition`に変更してください。
# それ以外は`mattermost-team-edition`のままにしてください。
MATTERMOST_IMAGE=mattermost-team-edition
# バージョンは
# https://hub.docker.com/r/mattermost/mattermost-team-edition/tags
# https://docs.mattermost.com/install/self-managed-changelog.html
# の2つの両方にある物を選択してください。
# 現状の最新は8.0です。
MATTERMOST_IMAGE_TAG=8.0

# Mattermostの公開ポートです。
# そのまま使うわけではないので8065にしたままにすることを推奨します。
APP_PORT=8065

# データベースの設定です。
# 変更しないでください
MM_SQLSETTINGS_DRIVERNAME=postgres
MM_SQLSETTINGS_DATASOURCE=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable&connect_timeout=10

# Mattermostの公開URL設定です
# 特定ポートで公開したい場合などは編集する必要がありますが、
# 今回の設定では不要です
MM_SERVICESETTINGS_SITEURL=https://${DOMAIN}

docker-compose.ymlを作り下記の内容にします。

version: "2.4"

services:
  postgres:
    image: postgres:${POSTGRES_IMAGE_TAG}
    restart: ${RESTART_POLICY}
    security_opt:
      - no-new-privileges:true
    pids_limit: 100
    read_only: true
    tmpfs:
      - /tmp
      - /var/run/postgresql
    volumes:
      - ${POSTGRES_DATA_PATH}:/var/lib/postgresql/data
    environment:
      - TZ
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_DB

  mattermost:
    depends_on:
      - postgres
    image: mattermost/${MATTERMOST_IMAGE}:${MATTERMOST_IMAGE_TAG}
    restart: ${RESTART_POLICY}
    security_opt:
      - no-new-privileges:true
    pids_limit: 200
    tmpfs:
      - /tmp
    volumes:
      - ${MATTERMOST_CONFIG_PATH}:/mattermost/config:rw
      - ${MATTERMOST_DATA_PATH}:/mattermost/data:rw
      - ${MATTERMOST_LOGS_PATH}:/mattermost/logs:rw
      - ${MATTERMOST_PLUGINS_PATH}:/mattermost/plugins:rw
      - ${MATTERMOST_CLIENT_PLUGINS_PATH}:/mattermost/client/plugins:rw
      - ${MATTERMOST_BLEVE_INDEXES_PATH}:/mattermost/bleve-indexes:rw
    environment:
      - TZ
      - MM_SQLSETTINGS_DRIVERNAME
      - MM_SQLSETTINGS_DATASOURCE
      - MM_BLEVESETTINGS_INDEXDIR
      - MM_SERVICESETTINGS_SITEURL
    ports:
      - ${APP_PORT}:8065

docker-compose up -dで実行します。
docker-compose logs -fでログを確認できます。

ログが出力されなくなったらCtrl + Cで終了しましょう。

Cloudflaredのインストール

今回はCloudflare Tunnel
でサーバを公開します。

Cloudflare packagesを参考にaptでCloudflaredをインストールできるようにします。

インストールが終わったらcloudflared --versionでインストールが正常にできているか試してみましょう。

$ cloudflared --version
cloudflared version 2022.10.3 (built 2022-10-26-1030 UTC)

Cloudflaredの設定はCloudflareの公式ドキュメントを参照してください。
Cloudflareは明らかにいい方向に向かっていますが、UIの変更が多いため、ここで説明しても多分すぐ変わります。

Public Hostnameで設定するローカルアドレスはhttp://localhost:8065です。
Additional application settingsは不要です。

Connect a networkセクションはスキップしてください。

動作確認

最後に、Mattermostにドメイン越しでアクセスできるか試してください。

初期設定も必要に応じて行ってください
(本来は初期設定は公開前に行ってください。セキュリティ事故が起こります)

docomo新プランeximo・irumoと過去プランの比較

2023/06/20時点で公開されている情報をもとに作成

割引・特典なし

500MB 1GB 3GB 5GB 6GB 7GB 9GB 10GB 20GB 60GB 100GB 無制限
eximo 4,565 5,665 7,315
5G ギガホ プレミア 5,665 7,315
ギガホ プレミア 5,555 7,205
irumo 550 2,167 2,827 3,377
ギガライト 3,465 4,565 5,665 6,765
ahamo 2,970 4,950
OCN モバイル ONE 550 770 990 1,320 1,760

WindowsをSSLインスペクション環境で利用する

メモ記事です。
私が困難に直面し次第、追記をします。
IssueとかPR投げてもらえれば反映するかもしれません。

Python

pipを使いWindowsの証明書を利用できるようにするパッケージを入れる。
現状、requestsで動作確認済み。
venv先にもインストールする必要がある。

pip自体もSSLを利用するため、明示的にいくつかのホストをTrustedさせている。

pip install pip-system-certs --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org

PHP

php.ini[curl][openssl]セクションに記述します。

[curl]
curl.cainfo =c:\fortigate.pem

[openssl]
openssl.cafile=c:\fortigate.pem

動作確認はphp -a

curl_exec(curl_init("https://ifconfig.io"));

などでいいと思います。

pfSenseを透過ファイアウォールとして設定する

普段はFortinetに魂を売っている筆者ではあるが、
さすがに各VMホストに導入するためだけにFortiGate-VMを購入していては破産するため、
pfSenseでお手軽ファイアウォールをするために透過ファイアウォールの設定を行う。

pfSenseは簡単に透過ファイアウォールを設定することができないので、
将来の私向けのメモとして記録を残す。

環境

  • pfSense 2.6.0

手順

インストール・WAN/LAN設定

インストール後にWAN/LAN設定がある、
後々のACL記述でWAN/LANの概念が存在するのため、
VMの外をWAN、VM内をLANとした。

IPアドレス割り当て

WEB UIにアクセスするためにWAN/LANのどちらか好きな方にIPアドレスを割り当てる。

ここで設定した値は後程消すことになるので、ある程度適当でも構わない。

また、使わないインターフェースはアドレス設定を空白で入力し、
アドレス無しで設定すると幸せになれるかもしれない。

WebUIへのアクセス・初期設定

admin:pfsenseでアクセスできる。
初期設定は適当に済ませるとよい。

WAN側から設定画面にアクセスしたい場合はShellから、

pfctl -d

でファイアウォールを一時無効化できる。

設定値は基本的に今後も使うが、
IPアドレス設定はどうせ消すため、適当でよい。

Bridgeを作る

Web UIでInterfaces -> Assignments -> Bridges -> AddからBridgeを作り、
WANとLANを追加する。

System -> Advanced -> System Tunablesから設定を開き、
net.link.bridge.pfil_bridge1にする。

Interface -> Assignmentsから、
BRIDGE0をAddし、OPT1を作る。

NATをオフにする

NATは不要なので、
Firewall -> NAT -> Outboundで設定に入り、
Disable Outbound NAT rule generationを指定する。

IPアドレスを設定する

WANとLANのIPv4/6 Configuration TypeをそれぞれNoneに設定する。

OPT1にIPv4/IPv6アドレスを最適な値に指定する。

OPT1はおそらくWANとLANをWeb UIから削除した後にCLIで設定するとよいだろう。

ルールの書き方

ファイアウォールルールでは、LAN・WAN・OPT1をすべて利用できる。

そのため、最低限様々な通信を通したい場合、
すべてのセクションにおいてとりあえずAllow allをするとよいだろう。

FortiGateの購入を考えている人へ

この記事では、FortiGateを購入しようか迷っている人向けに、
様々な代替品や自宅ネットに向いているかどうかについて記述します。

代替案

FortiGateは多くの場合4kからご購入いただけます。
もし、コンピュータやVMハイパーバイザをお持ちの場合は実際の使用感をお試しいただけます。

Sophos Firewall Home Edition

Sophos社はイギリスのセキュリティソフトウェア・ハードウェアベンダです。

Sophosは無償ツールとして、
Sophos Firewall Home Editionを提供しています。

システム要件は高いですが、UTMアプライアンスを購入する前に試す感覚で利用してみるといいでしょう。

FortiGate-VM

FortiGate-VMはFortiGateのVMイメージ版です。
VMのため、ハードウェアアクセラレーションが利用できませんが、使用感を確認する用途では十分です。

FortiGate-VMは優勝製品ですが、製品デモが存在します。
実機を導入する前に一度使ってみるとよいでしょう。

FortiGateの選び方

製品名の見方

FortiGate製品の製品名は基本、下記のフォーマットで記述されています。

FortiGate nnX

FortiGate: シリーズ名
nn: 任意の数字 多くの場合、2-4桁
X : アルファベット1文字

Xは世代を表します。2023/01/17時点ではFが最新世代です。

nnは機種の世代内での優位性を表します。
多くの場合、数字が大きくなれば上位機種になります。
また、1桁目は多くの場合、機能が追加されたものを表します。
例えばFortiWifiシリーズの50EとFWF-51Eは、内部ストレージの有無が異なります。
(Data Sheet)

FortiWifiシリーズは、FortiGateにWi-Fiアクセスポイント機能が追加されたものです。

製品の選び方

OSサポートで選ぶ

FortiGate製品は同一世代の場合でもサポート内容が異なる場合があります。
例えば、50Eと60Eは同一世代ですが、50EはOSが6.2まで対応なのに対し、60Eは現状最新版である7.2に対応しています。
(参考)

この問題は顕著に影響し、50EのOSの最終サポートは2023/9/28ですが、60Eは2026/9/30まで行われ、
もし次期OSにも対応するのであればこの期限はさらに伸びます。
(参考)

追加された機能で選ぶ

OSサポートは追加された機能に顕著に影響します。

例えば、MAP-Eサポートなどは6.4以降であり、
50Eは対象外
(参照)
になります。

基本機能で選ぶ

基本的な機能は各FortiGateのデータシートを参照してください。

また、OSごとにFeature Platform Matrixが公開されています。
こちらを参照することで、各製品の大まかな機能や制限を確認することができます。

性能で選ぶ

基本的な性能はは各FortiGateのデータシートを参照してください。

例として、当環境では50EはSSLインスペクションを行うと、80Mbps-100Mbpsほどのスループットを記録します。

お持ちのForti製品との連携で選ぶ

FortiGateは同じFortinet社の製品と強い連携が可能です。

例えば、FortiAnalyzerをお持ちの場合、
公式ドキュメントのCompatibility with FortiOSセクションを確認し、
お持ちのFortiGateがどのFortiOSに対応しているか確認してください。

FortiGateでセキュリティ上の恩恵を受けることができるか調べる

FortiGate 50Eの場合、確認できた限り下記の通信を監視することができます。

  • 特定のSSL通信
  • SSL通信の中身 (CA証明書のインストールが必要)
  • SSL証明書
  • 中身のインスペクションが可能
  • HTTP
  • SMTP
  • POP3
  • IMAP
  • MAPI
  • FTP
  • CIFS
  • DNS (53)
  • 通信があったことの確認・ブロックが可能
  • Application Signaturesに登録されている通信

また、QUICなどの対応していないプロトコルの通信も存在します。

これ以降は、特記すべき点が存在する機能について記述します。
また、各機能は基本ライセンス無しで運用できますが、定義ファイルの更新にはライセンスが必要です。

SSLインスペクション

SSLインスペクションを行う際は、基本的にCAルート証明書のインストールが求められます。
また、Androidなどの一部OSや製品はSSLインスペクション状態で一部機能が正常に動きません。

そのため、AndroidやGoogle HomeなどのデバイスはSSL証明書インスペクションへの切り替えが必要です。

SSLインスペクションにライセンスは必要ありません。

QUICなど、インスペクションできない通信も存在します。

AntiVirus

マルウェアのHashを読ませることで、ライセンス無しでAntiVirus機能が利用できますが、
本体に保存できるHashの数を考えると実用的ではありません。

Web Filter

Web Filter機能はライセンス無しで利用できますが、
FortiGuard category based filterがオンの場合はすべての通信がブロックされます。

YouTubeチャンネル制限はFortiOS 6.2.12では現状利用できません。

また、File Filterにおいて、動作状況が確認できないフィルター設定が存在します。

DNS Filter

DNS Filter機能はライセンス無しで利用できますが、
FortiGuard category based filterは利用できない可能性があります。

FortiGate所有の注意点

FortiGateを所有される際は、
上記のセキュリティ機能の特記事項に加え、
下記の点について十分注意してください。

ファームウェア

FortiGateではライセンス契約を行っていない場合、
正規の方法でファームウェアを取得できません。

脆弱性

FortiGateはUTMシェア1位という立場上、
セキュリティ脆弱性が多く発見されています。

VPN機能などを利用するうえでFortiGateに外部からアクセスできるようにする場合、
FortiGateのファームウェアを最新のものにするなど、セキュリティ対策を怠らないでください。

おわりに

筆者はFortiGate 50Eのオーナーですが、FortiGateはライセンスがあって輝きます。

しかし、ライセンスが無くても十分輝ける余地を持っている良い子です。
(あと、かっこいい)

購入前にこの記事をよくご確認いただき、
幸せなインターネットライフをぜひFortiGateとお過ごしください。

個人的なFortiの設定

この記事では、他の環境にも転用が効きそうなFortiGateの設定を記述します。

基本的に私が使っているFortiGateに合わせて随時更新していくと思います。

前提

  • FortiGate 50E
  • FortiOS 6.2.12

更新履歴

日時 内容
2023-01-11 初版

Security Fablic

Settings

Cloud Loggingを有効に設定、
頻度はRealtimeを選択

Fabric Connectors

Policy & Objects

IPv4 Policy

先頭に

  • Feodo Trackerリストからの通信をDROP (Logあり)
  • Feodo Trackerリストへの通信をDROP (Logあり)

を追加

Security Profiles

AntiVirus

  • Detect Viruses: Block
  • Inspected Protocols: すべてOn
  • APT Protection Options: すべてOn
  • Original File Destination: お好みで (私はDiscard)

Web Filter

  • FortiGard category based filter: お好みで (ライセンスがない場合はOff)
  • File Filter
  • Log: On
  • Scan Archived Contents: On
  • List:
    • Deny password protected
    • Protocols: HTTP + FTP
    • File types: 7z, rar, zip
    • Action: Block
    • Direction: Incoming
    • Match Password Protected Files: On
  • Search Engines: お好みで
  • Static URL Filter
  • Block invalid URLs: On

DNS Filter

  • FortiGuard category based filter
  • Remote CategoriesにFabric Connectorsで指定した定義があるのでブロック
  • それ以外はお好みで、個人的には
    • Malicious Websites: Block
    • Phishing: Block
    • Spam URLS: Block
    • Dynamic DNS: Monitor
    • Newly Observed Domain: Monitor
    • Newly Registerd Domain: Monitor
    • Unrated: Monitor
  • Static Domain Filter
  • External IP Block Lists: Fabric Connectorsで指定した定義があるのでブロック
  • Options
  • Allow DNS requests when a rating error occurs: お好みで (私はOm)
  • Log all DNS queries and responses: On

Application Control

  • Categories: ProxyとP2Pをブロック、それ以外はMonitor
  • Options
  • Allow and Log DNS Traffic: Yes
  • QUIC: Block

Intrusion Prevention

  • Obfuscated.JavaScript.Access: Allow, Disable Logging
  • Seveity 3-5: Block, Log
  • Seveity 2: Default, Log
  • Scan Outgoing Connections to Botnet Sites: ライセンスがあるならBlock

Email Filter

  • Enable Spam Detection and Filtering: On
  • Span Detection by Protocol: お好みで
  • FortiGuard Spam Filtering: すべてOn
  • Local Spam Filtering: Black White List以外On
  • File Filter: すべてOn

SSL/SSH Inspection

別で記事を用意します。