teru

teru

Infrastructure Engineer / Server Side Engineer

nginx

nginx 1.19.4 以降で ChaCha20-Poly1305 の運用が現実的になった件

はじめに 先日、nginx 1.19.4 がリリースされ、ssl_conf_command ディレクティブが追加されました。 これにより、ChaCha20-Poly1305 を使った暗号スイートの運用が現実的になりました。 ChaCha20-Poly1305 の概要 RFC 7905 (2016/06) より、TLS における ChaCha20-Poly1305 の利用が標準化され、様々なライブラリで利用可能になっています。 OpenSSL だと 1.1.0 以降で利用可能です。 ChaCha20-Poly1305 は、ストリーム暗号である ChaCha20 とメッセージ認証符号である Poly1305 を組み合わせた、認証付き暗号です。 ChaCha20-Poly1305 はソフトウェア処理に向いた、簡潔なアルゴリズムです。 AES はハードウェア処理 (AES-NI) が利用できる環境ではとても高速ですが、ソフトウェア処理においては ChaCha20-Poly1305 の方が

Network

Amazon Linux 2 で再起動せずに TCP BBR を有効にする

はじめに Amazon Linux 2 で TCP BBR を有効にするにあたって調べてみると、再起動を伴う手順ばかりなので、ほんとにそうなのか検証しました。 検証環境 OS: Amazon Linux 2 AMI AMI: amzn2-ami-hvm-2.0.20190618-x86_64-gp2 (ami-0c3fd0f5d33134a76) カーネル: 4.14.123-111.109.amzn2.x86_64 OS: Amazon Linux AMI 2018.03.0 AMI: amzn-ami-hvm-2018.03.0.20190611-x86_64-gp2 (ami-04b2d1589ab1d972c) カーネル: 4.14.123-86.109.amzn1.

nginx

サブリクエスト内部のコンテキストに注意

アップローダの認証を API に行わせる、という設定をしていて、少しハマった。 こんな設定を入れてみたところ、クライアントからの POST リクエストが返ってこない。 location /api { proxy_pass http://backend-api; } location /uploader { auth_request /api/authn; client_max_body_size 0; proxy_buffering off; proxy_request_buffering off; proxy_pass http://backend-uploader; } ちょっと調べてみると、 auth_request によるサブリクエストをプロキシするときは、ボディを空にしないと行けないらしい。 これは 公式の例 にも書いてある。 そこで、下記の設定を入れると、今度は 500 が返るようになった。

nginx

nginx と openssl-1.1.1 で TLS 1.3 の暗号スイートを "ムリヤリ" 設定する

2020/02/04 追記 こんなことしなくても openssl.cnf でデフォルト設定できるんですね。知らなかった…。 経緯 openssl 1.1.1 で TLS 1.3 がサポートされましたね。 nginx でも使えますが、実はまだ完全ではありません。 ssl_ciphers を設定しても、TLS 1.3 の暗号スイートは、指定した順序にはならず、デフォルトの下記の順になってしまいます。 TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 これは openssl で、TLS 1.

Docker

PlantUML Server を Docker で動かすときの URL ルート設定

経緯 plantuml/plantuml-server:jetty は、 http://localhost:8080/ で動きますが、歴史的な経緯で http://localhost:8080/plantuml/ で動かしたいと思いました。 docker run 時に -e JAVA_OPTIONS="-Djetty.contextpath=/plantuml" を付けてみたり、 /var/lib/jetty/start.d や /usr/local/jetty/etc 等の設定をいじったりしてみても変わってくれず、悩んでいました。 色々試行錯誤して、わりと簡単な形で落ち着きました。 解決 plantuml/plantuml-server:jetty の元となっている jetty の Desc を見ると、

Ansible

Amazon Linux 2 の Gather facts を見てみる

Amazon Linux 2 正式版でた! ついに Amazon Linux 2 の RC が取れましたね。 これから使っていく上で Ansible での OS 判定が必要になってきます。 Gather facts Gather facts の使えそうなところを抜粋してみます。 ※ ansible 2.5.4 で実行 まず参考に Amazon Linux ### amzn-ami-hvm-2018.03.0.20180412-x86_64-gp2 "ansible_distribution": "Amazon", "ansible_distribution_major_version": "NA"

Ansible

Ansible での include の良い書き方

よくある書き方の問題点 例えば include_tasks でググってみると、こういう感じの書き方をよく見かけます。 ### tasks/main.yml - name: Include tasks (RedHat 6) include_tasks: install_redhat_6.yml when: ansible_os_family == 'RedHat' and ansible_distribution_major_version|int == 6 - name: Include tasks (RedHat 7) include_tasks: install_redhat_7.yml when: ansible_os_family == 'RedHat'

systemd

systemd で ulimit 上げるときの推奨の方法

TL;DR ユニット設定ファイルに LimitNOFILE を書く /etc/systemd/system/<unit>.d/override.conf に書くとなおよい 経緯 CentOS 7 に MariaDB を構築していて、my.cnf に下記設定を入れていました。 open-files-limit = 65536 しかし、プロセスの Limit を調べてみると 1024 になっていて、ログにもその旨が出ています。 # cat /proc/`pidof mysqld`/limits | grep -i "max open files" Max open files 1024 4096

Vagrant

Vagrant の bridge にホストマシンのデフォルトルートの NIC を自動指定する

VirtualBox on OS X にて Vagrant で複数 VM を起動するとき、public_network を使っていると毎度ブリッジインタフェースの選択が面倒です。 各 VM の起動時に都度選択画面が出るので、全台起動するまでターミナルに張り付いていないといけません。 下記のように固定してしまっても良いのですが、ホストマシンが有線接続な時はそちらにブリッジしたいという欲もあります。 config.vm.network "public_network", bridge: 'en0: Wi-Fi (AirPort)' そんなときは下記のように Vagrantfile 中に一文入れてしまえば良いです。 ありがたいことに、VBoxManage list bridgedifs は、ホストマシンのデフォルトルートのインタフェースを 1 番目に出力してくれるので、これを bridge オプションに入れるようにします。 Vagrant.configure(2) do |config| ...snip.

Diary

[syslog-ng] 「特定の送信元 IP・それ以外」のフィルタ設定

久々に syslog-ng を使う機会があったのでメモ。 やりたいこと いくつかの特定の IP は、1 つのログファイルにまとめたい それ以外は、IP 毎にファイルを分割したい たとえば、ネットワーク機器のログは 1 つにまとめ、その他サーバ機器のログは個別に分割したい、というような時。 設定 こんな感じにする source s_remote { tcp(ip(0.0.0.0) port(514)); udp(ip(0.0.0.0) port(514)); }; filter f_specific { host(^172.16.0.1$) or host(^172.

Dnsmasq

[OS X] DHCP で取得した DNS サーバを使いつつ dnsmasq を使う

検証や開発のために OS X ローカルで dnsmasq を使うとき、 リゾルバの向き先を変えるためにいちいちネットワーク環境設定を開くのが面倒 (コマンドでもできるけど) 指定ドメイン名以外は通常通り名前解決したい と思っている人のために。 TL;DR /etc/resolver 配下に指定ドメイン名でファイルを作れば良い。 方法 指定ドメインのリゾルバを変更 設定 $ sudo mkdir /etc/resolver $ sudo chown <USER>:wheel /etc/resolver $ echo 'nameserver 127.0.0.1' > /etc/resolver/example.com OS X では /etc/resolver 配下にドメイン名でファイルを作る (書式は resolv.conf

Diary

Supervisor の始め方とポイント

ようやっと daemontools から Supervisor に乗り換えました。 ナウくていいですね。 ちょっとポイント書いていきます。 (バージョン: supervisor 3.1.2) pip でインストール # yum install python-setuptools # easy_install pip # pip install supervisor epel リポジトリにもありますが、若干古いので pip で入れることにしました。 EPEL5/6 だと 2.1、EPEL7 だと 3.0 が入りました。 (2014/10/21) 基本設定と起動 メイン部分 (Supervisor 自体) の設定と、管理する子のプログラムの設定はファイルを分けるのが僕のポリシーです。 /etc/supervisord.d

shell

ProxyChains をちょっと便利に使う

ProxyChains という、プログラムの TCP/DNS 通信を、指定した socks に通してくれるツールがあります。 よく下記のような使用例が書かれてます。 $ proxychains telnet 192.0.2.11 80 $ proxychains ssh 192.0.2.11 $ proxychains curl http://example.com/ これ、proxychains でシェル自体を起動しちゃえばいいんじゃないかと思ってやってみました。 $ tor & $ proxychains bash $ curl -kLs https://check.torproject.org/ | grep -i congratulations [proxychains] DLL init [proxychains] DLL init

tmux

tmux を気軽に使いはじめるために

いままでいろんな人に tmux を進めてきましたが、ターミナルマルチプレクサの使用経験が無い人にとっては、概念を掴むまで、というか、アタッチ・デタッチの操作を覚えるのに抵抗を感じてしまう人が多いように感じます。 というわけで、.bashrc なり .zshrc なりに下記を書いてあげると良いかなと。 function tm() { if [ -n "${1}" ]; then tmux -2 attach-session -t ${1} || \ tmux -2 new-session -s ${1} else tmux -2 attach-session || \ tmux -2 new-session fi } 何も考えずに tm と打つだけで、既にセッションがある時はアタッチ、無いときは新規作成、という動きをしてくれるので楽です。 初稿 (Mon, 21 Apr 2014

Zabbix

[zabbix] 毎日決まった時刻にアイテムを取得する

毎日決まった時刻にアイテムの値を取りたいときは、下記のような感じで設定を入れると良さそう。 下記は毎朝 AM 06:00 にファイルのタイムスタンプを取得する例。 しばらく動かしてみているけれど、今のところうまく動いている。 アイテムの設定の Flexible intervals (日本語UI: 例外の更新間隔) にて Interval を 0 にすると、指定した期間はデータの更新が行われない。 ※ zabbix 2.2.3 初稿 (Wed, 16 Apr 2014 20:30:14 JST)

FreeBSD

portmaster でのインストール時に依存パッケージは pkgng で入れる

FreeBSD 10.0 を使い始め、pkgng の恩恵を預かっているとはいえ、カスタムしたい ports もあります。 その際、(僕は) portmaster を使うことになるのですが、そのパッケージに依存するパッケージは、可能なら pkgng でインストールを行いたいのです。 例えば libav をカスタマイズしたいときは、下記の手順です。 もっといい方法ありそうですが…。 インストールしたい ports の config を行う # cd /usr/ports/multimedia/libav # make config ...snip... portmaster が依存でインストールするパッケージをリスト化 # portmaster --show-work multimedia/libav | grep -w 'NOT INSTALLED' | cut -d'/' -f2 >

FreeBSD

[FreeBSD 10.0-RELEASE] bsdinstall でも自由なパーティションレイアウトで Root on ZFS

あらすじ FreeBSD 10.0 からインストーラで ZFS が選択できるようになりました。 僕の自宅のストレージサーバは、8.2 の頃から Root on ZFS になっていたり、freebsd-update で数回メジャーバージョンを渡ってきていたりするため、そろそろ一度クリーンインストールしてスッキリしたいと思っていました。 早速 Partitioning の項目で ZFS を選択してインストールしたはいいものの、パーティションと ZFS の切り方は下記のようになっていました。 # gpart show -l => 34 209715133 vtbd0 GPT (100G) 34 1024 1 gptboot0 (512K) 1058 4194304 2 swap0 (2.0G) 4195362 205519805 3 zfs0

nginx

MacBook に nginx でフォワードプロキシを立てておくと何かと便利

閉域ネットワークに設置されたサーバのメンテ中、サーバから外にアクセスしたいなと思いました。 閉じたネットワークに、MBP を有線でつないでいて、MBP からはポータブル Wi-Fi 経由で外に出れる状況です。 ------+------------+--------- 閉域ネットワーク | | +----+----+ | | サーバ | ... | +---------+ | 有線 | +----+----+ | MBP | - - - >> ポータブル Wi-Fi - - - >> [インターネット] +---------+ というわけで、下記のような感じで MBP に nginx でフォワードプロキシを立てました。 [MBP]$ brew install nginx [MBP]$ vi /usr/local/etc/

Node

[node.js] ndenv と npm と daemontools

久々のエントリです。 このブログを WordPress から Ghost に乗り換えました。 markdown スラスラ書けて良い…! Ghost は node.js で書かれたアプリです。 今回 node.js 製アプリに触れるのは初めてだったので、セットアップするにあたって、自分なりの tips をまとめてみました。 ndenv でバージョン管理 Ruby, Perl でもそうなのですが、僕は env 系はシステムワイドに配置しています。 インストール等が必要な時は root になって作業します。 # git clone https://github.com/riywo/ndenv.git /usr/local/ndenv # git clone https://github.com/riywo/node-build.

tmux

tmux のステータスバーに nagios アラートの内容を表示

アラートが発砲した際に、tmux のステータスバーに内容を表示するようにした話。 監視は nagios でやっており、アラートメールの内容は以下の感じ。 Subject: *** PROBLEM (blog.kteru.net) HTTP is CRITICAL *** ***** TERU Nagios ***** PROBLEM Service : HTTP Host : blog.kteru.net Client : blog.kteru.net Address : 219.94.233.178 State : CRITICAL Time : Mon May 6 17:55:44 JST 2013 Info : CRITICAL - Socket timeout after

shell

シェルスクリプトと同階層のファイルを扱う時

シェルスクリプトの中で、そのスクリプトと同階層のファイルを扱いたい場合、下記のような事をよくやると思う。 #!/bin/sh DIR_BASE=`dirname ${0}` cat ${DIR_BASE}/file1 cat ${DIR_BASE}/file2 ただこのやり方だと、./script.sh のように実行した場合、DIR_BASE には . が入ってしまう。 ひとたびスクリプトの中でディレクトリ移動してしまうと、同階層にもどってこれないので、DIR_BASE は下記のように得た方が良い。 #!/bin/sh DIR_BASE=$(cd $(dirname ${0}); pwd)