QUIC を試してみた

こんにちは masm11 です。 QUIC の RFC が出ましたね。

https://datatracker.ietf.org/doc/html/rfc9000

5月なので2ヶ月も前ですが… というわけで、今回は遅ればせながら QUIC を試してみたいと思います。

nginx を設定

まず、nginx を QUIC 対応版にします。Arch Linux を使っているので AUR からインストールします。

wget https://aur.archlinux.org/cgit/aur.git/snapshot/nginx-quic.tar.gz
tar zxf nginx-quic.tar.gz
cd nginx-quic 
makepkg -s
sudo pacman -U nginx-quic-1.21.0-3-x86_64.pkg.tar.zst

そして /etc/nginx/nginx.conf を設定します。

server ブロックに以下のように quic と http3 を指定します。

   server {
        listen       443 ssl http2;
        listen       [::]:443 ssl http2;
        listen       443 quic http3;
        listen       [::]:443 quic http3;

server ブロックに以下の一行を追加します。

       add_header Alt-Svc 'h3=":443"; ma=86400, h3-29=":443"; ma=86400';

これは「QUIC も使えるよ〜」という宣言です。

nginx を restart します。

sudo systemctl restart nginx

軽く確認してみます。

shiro:nginx % sudo ss -lnp | grep :443
udp   UNCONN 0      0             0.0.0.0:443              0.0.0.0:*     users:(("nginx",pid=21153,fd=9),("nginx",pid=21152,fd=9))
udp   UNCONN 0      0                [::]:443                 [::]:*     users:(("nginx",pid=21153,fd=10),("nginx",pid=21152,fd=10))
tcp   LISTEN 0      511           0.0.0.0:443              0.0.0.0:*     users:(("nginx",pid=21153,fd=7),("nginx",pid=21152,fd=7))
tcp   LISTEN 0      511              [::]:443                 [::]:*     users:(("nginx",pid=21153,fd=8),("nginx",pid=21152,fd=8))
shiro:nginx % 

TCP に加えて UDP も bind してますね。

ファイアウォールに穴を開ける

使っているツールによりますが、iptables ならこんな感じでできます。

sudo iptables -I INPUT -p udp --destination-port 443 -j ACCEPT

確認

ではブラウザからアクセスしてみましょう。

サーバで以下のように実行しておき、

sudo tcpdump -i ens3 -n -s 0 -w cap.dat port 443

Firefox からアクセスしてみます。

Firefox のデベロッパーツールで見ると、alt-svc ヘッダと HTTP/3 であることが確認できます。

f:id:masm11:20210716215941p:plain

また、tcpdump が生成した cap.dat を手元にコピーして wireshark で見ると、 QUIC で通信できていることが確認できます。

f:id:masm11:20210716215953p:plain

なお QUIC は、まずは TCP でアクセスし、UDP で接続できそうなら (alt-svc で指定されていたら) 次から UDP を使います。なので、最初のうちは TCP になります。 確認する際は多少まとまった通信をした方が良いです。

まとめ

今回は QUIC をテストしてみました。 最新技術っていいですよね 。

インゲージでは最新技術もわくわくなエンジニアを募集しています。以下のページからお願いします。

https://ingage.co.jp/recruit/

ChatOps: SlackからLambdaに連携してみる(4)

id:kizashi1122 です。

f:id:ingage:20210620201734p:plain

ひとまず Slack から Lambda を呼び出すところまでは終わりました。 (といってもURL確認用のリクエストを受け取っただけです)

ワークスペースにアプリをインストールする

まだコードは何も書いてないですが、Slack から使ってみたいのでインストールします。

f:id:ingage:20210628122716p:plain

クリックします。次の画面では「Accept」すればよいです。 チェックが入りましたね。

f:id:ingage:20210628122833p:plain

ではこの「echoapp」をSlackのチャンネルに追加してみましょう。最初はテスト用に作ったチャンネルで試すのがいいかもしれません。ここでは #app-test としています。

f:id:ingage:20210628123503p:plain

上記の「Add an App」をクリックして「echoapp」を選択して追加します。

f:id:ingage:20210628123608p:plain

追加されました。ではメンションしてみましょう。

f:id:ingage:20210628124724p:plain

何も起きません・・・。
そもそも Lambda まで届いているのかすらわかりません。ログを確認しましょう。

ここから確認できます。

f:id:ingage:20210628124903p:plain

タイムスタンプを見るにちゃんと届いてそうです。ログを出してみます。Ruby なので p で引数の event を標準出力に出力してみるだけです。
ログ出力コードを入れてデプロイし、更にメンションしてみます。

同じようにログを確認し、さらにリンクを飛んで CloudWatch Logs までいきます。

f:id:ingage:20210628130034p:plain

へー、イベントの中身ってこうなってるのねーというのがよくわかります。

中で気になるものを赤枠で囲ってます。1つ目が token です。簡単なリクエストチェック(Slack からのリクエストであるということの検証)に使えます。
2つ目はエコーする内容です。ここをそのまま返せばエコーできそうだなとわかります(このときは「@echoapp hello2」と投稿してました)。

1つ目について、トークンの一致性を見るだけなら簡単なので実装しておきましょう。本当は署名チェックをするのがよいようです。

Verifying requests from Slack | Slack

Slack から送られるトークンについてはここにあります。

f:id:ingage:20210628131244p:plain

これを Lambda 側の環境変数にいれておき(画面省略)、コード上ではこう比較すればよいでしょう。

require 'json'

def lambda_handler(event:, context:)
    # p event
    req = JSON.parse(event['body'])
    if ENV['SLACK_VERIFICATION_TOKEN'] != req['token']
        return { statusCode: 401, body: "VERIFICATION TOKEN UNMATCHED" }
    end
    
    { statusCode: 200, body: 'done' }
end

さて、次はいよいよLambda側からエコーする部分を作りましょう。

続きはこちら。

ChatOps: SlackからLambdaに連携してみる(5) - インゲージ開発者ブログ

ChatOps: SlackからLambdaに連携してみる(3)

id:kizashi1122 です。

前回のエントリで発行した API Gatewayの URL をメモしておきます。

f:id:ingage:20210620201734p:plain

では Slack にアプリの設定をしましょう。

Slack 上でアプリを作る

こちらにアクセスします。

Slack API: Applications | Slack

基本設定

Create New App ボタンを押します。ダイアログで「From Scratch」と「From an App Manifest」を選択しろと言われるので、「From Scratch」を選択します。

アプリ名は「echoapp」としておきましょう。

f:id:ingage:20210626230506p:plain

Event Subscriptions

まずは有効にしましょう。

ここはSlack側で発生したイベントを設定する画面です。
「イベント」と「イベントを受け取るURL」を設定することができます。

f:id:ingage:20210626231553p:plain

Request URLの設定

では、前回のエントリで発行したURLを設定してみましょう。

f:id:ingage:20210628113002p:plain

まだ Lambda を設定してないのでエラーになります。 URLの Verificationとして Slack から飛んでくるリクエストに対して正しくレスポンスを返す必要があります。

https://api.slack.com/events/url_verification

要はリクエストで送られてきた challenge パラメータを、そのままレスポンスに返してくれということですね。 Lambda を以下のように編集してデプロイします。

require 'json'

def lambda_handler(event:, context:)
    # TODO implement
    # { statusCode: 200, body: JSON.generate('Hello from Lambda!') }
    req = JSON.parse(event['body']) # event['body'] は文字列
    { statusCode: 200, body: req['challenge'] }
end

これをデプロイ後に URL にある「Retry」をクリックすると、

f:id:ingage:20210628115420p:plain

「Verified」になりました。

イベントの設定

次にイベントを設定します。イベントは以下で一覧を確認することができます。

Events API types | Slack

いろんなイベント(作る側からするとトリガー)があることがわかります。今回は前回のエントリで書いたとおり

@echoapp hoge

とメンションされたときに発動するようにしたいので app_mention を選択することになります。

f:id:ingage:20210626231915p:plain

保存して終了です。

まだ Lambda のソースコードは URL 確認用のままです。 次はこれを編集します。

続きはこちら。

ChatOps: SlackからLambdaに連携してみる(4) - インゲージ開発者ブログ

ChatOps: SlackからLambdaに連携してみる(2)

id:kizashi1122 です。

f:id:ingage:20210620201734p:plain

最初にSlack のアプリの設定をしたくなりますが、Slack 側から叩かれる URL の準備を先にする必要がありますので、先に Lambda の設定をしましょう。

Lambda の設定

Function を作成します。名前は何でもいいですが、slack-echoapp にしましょう。 使用言語も何でもかまいません。ここでは Ruby を選択します。

f:id:ingage:20210627012315p:plain

次にトリガーを設定します。

f:id:ingage:20210627013014p:plain

API Gateway を選択し、以下のように選択して Add します。

f:id:ingage:20210627013731p:plain

API Gateway がトリガーとして設定されました。
API Gateway 側の設定をします。

f:id:ingage:20210629173602p:plain

API Gateway の設定

デフォルトではリクエストメソッドは ANY になっています。 実際は Event Subscription では POST のみを使います。 なので実際の運用では ANY ではなく POST に限定したほうがよいです。

今回は、ANYをクリックして「Integration Request」 の設定をします。 ここが、Lambda との連携を設定する箇所になります。が、そもそも Lambda から飛んできているので初期値としてちゃんと設定されています。

f:id:ingage:20210627014519p:plain

URL がすでに発行されているので確認しましょう。 左メニューの「Stages」をクリックして、Stages から「default」をクリックすると上部にURLが表示されます。

f:id:ingage:20210627015029p:plain

このURLを Slack のアプリに設定することになります。

では今回はこれで終わります。

次はSlack アプリの設定です。

続きはこちら。

ChatOps: SlackからLambdaに連携してみる(3) - インゲージ開発者ブログ

Sophos Anti-Virus for Linux Free Edition が終わったので、今更 ClamAV をインストールした

こんにちは、masm11 です。

f:id:masm11:20210623014007p:plain

普段、家庭内サーバに Sophos Anti-Virus for Linux Free Edition をインストールして使ってました。 が、ある日突然、こんな通知が来ました。

Sophos Anti-Virus for Linux Free Edition の製品サポートは終了しています。 アップデートは引き続き入手できますが、後日終了される予定です。 詳細は、次のサイトを参照してください。 https://community.sophos.com/free-antivirus-tools-for-desktops/b/blog/posts/retirement-of-sophos-anti-virus-for-linux-free-edition

仕方なくアンインストールし、代わりに今更 ClamAV をインストールしたので、メモ代わりに残しておきます。

SAV をアンインストール

まず service を止めましょう。

様子を確認して、

[root@mike bin]# systemctl list-unit-files | grep sav
sav-protect.service                                                           enabled         disabled
sav-rms.service                                                               disabled        disabled
sav-update.service                                                            enabled         disabled

ひとつずつ止めていきます。

[root@mike bin]# systemctl stop sav-update
[root@mike bin]# systemctl disable sav-update
Removed /etc/systemd/system/multi-user.target.wants/sav-update.service.
[root@mike bin]# systemctl stop sav-protect
[root@mike bin]# systemctl disable sav-protect
Removed /etc/systemd/system/multi-user.target.wants/sav-protect.service.

もう一度確認します。

[root@mike bin]# systemctl list-unit-files | grep sav
sav-protect.service                                                           disabled        disabled
sav-rms.service                                                               disabled        disabled
sav-update.service                                                            disabled        disabled

全部 disable になってますね。では reboot します。

[root@mike bin]# reboot

残り作業であるファイルの削除は script に任せます。

[root@mike ~]# /opt/sophos-av/uninstall.sh 
Uninstalling Sophos Anti-Virus.
Sophos Anti-Virus has been uninstalled.

ClamAV のインストール

私は Arch Linux なので、↓こちらの資料を参考にしながら進めました。

https://wiki.archlinux.jp/index.php/ClamAV

まずインストールします。

mike:~ % sudo pacman -S clamav

freshclam を起動します。

mike:~ % sudo systemctl start clamav-freshclam.service 
mike:~ % sudo systemctl enable clamav-freshclam.service
Created symlink /etc/systemd/system/multi-user.target.wants/clamav-freshclam.service → /usr/lib/systemd/system/clamav-freshclam.service.

ここで、clamav-freshclam.service の中身を見るとわかるのですが、 /etc/cron.d/ で設定してあると、それは cron で定期的に起動することが 期待されるので、boot 時に起動しないようになっています。 私の場合はその設定はしてないので、boot 時に起動します。

で、ここでデータベースのダウンロードが始まります。 少し時間がかかるので、時々

mike:~ % sudo ls -l /var/lib/clamav/

を実行しながら、書き込みが収まるまで待ちましょう。

終わったら scan してみます。ウイルスのいそうなディレクトリ目がけて、えいやっと。

mike:~ % clamscan --recursive --infected --max-scansize=4000M /home/backup/luna-asus/masm/Mail/spam
/home/backup/luna-asus/masm/Mail/spam/6369: Img.Dropper.PhishingLure-6329856-0 FOUND
/home/backup/luna-asus/masm/Mail/spam/6759: Xls.Dropper.Generic-6595971-0 FOUND
/home/backup/luna-asus/masm/Mail/spam/6907: Xls.Dropper.Generic-6595971-0 FOUND
/home/backup/luna-asus/masm/Mail/spam/6370: Img.Dropper.PhishingLure-6329856-0 FOUND
/home/backup/luna-asus/masm/Mail/spam/6131: Xls.Dropper.Generic-6595971-0 FOUND

おぉ、ちゃんと検出してくれました。

では cron に仕掛けてしましょう。

mike:~% sudo crontab -e
0 2 1 * * /usr/bin/clamscan --recursive --infected --max-scansize=4000M --exclude-dir='^/sys|^/dev|^/proc' / | syslog -t clamscan

毎月1日の午前2時からスキャンを開始するようにしました。 この家庭内サーバはアクティブに使ってるサーバではないので、 この程度の頻度で定期的にスキャンするだけで十分です。 また、realtime scan とかやる気は全くありません。

ただ、本当はメール通知くらいはしたいんですけどね。 SAV の時はやってました (そのチャンネルを使ってサービス終了通知が来たわけです)。

まとめ

さすが ClamAV は簡単でいいですね。

スキャンにかかる時間にも注目したいです。 SAV の時はファイルシステム全体のチェックに丸2日程かかってました。 毎月3日くらいになると通知メールが来てたわけですね。 ClamAV でどのくらいかかるのでしょうね。

インゲージではエンジニアを募集しています。以下のページからお願いします!

https://ingage.co.jp/recruit/

ChatOps: SlackからLambdaに連携してみる(1)

id:kizashi1122 です。

最近、ChatOps ではないですが、ふと Slack から Lambda に連携し、AWS 内でゴニョゴニョしたいなと思い、下記のように連携をしたのですが、案外ネット上に情報がなく色々苦労したので、ここでまとめておこうかと思います。

f:id:ingage:20210620201734p:plain

目標

ここでは Slack に echoapp というアプリを作り、

@echoapp Hello!

と Slack に投稿すると、

Hello!

と同じ内容を返すアプリを作ってみましょう。 この「同じ内容を返す」という部分をAWS内のAPIを呼び出したり、外部の API を呼び出すなどすると色々と夢が広がると思います。

おおまかな手順

  1. Slack App を作成する
  2. Lambda を作成する
  3. API Gateway を作成する
  4. ここで発行した URL を Slack App に設定する

次回、「1. Slack App を作成する」をします。

お楽しみに。

続きはこちら。

ChatOps: SlackからLambdaに連携してみる(2) - インゲージ開発者ブログ