AWSの転送量が高かった

先月 2018年10月 はなぜかAWSの転送量が今までの倍に増えてしまった.

分析

私のアカウントでは,以下の2つのパターンで転送が生じる.

  • cloudfrontを通じたS3からのweb hosting
  • goofysを利用したS3のリモートマウント (owncloudに利用)

先々月と比較してcloudfrontの利用料金は変化ないが,転送量が増えていることから,まぁowncloudのせいだと思うんだけど,一応調べることにした.

準備

cost explorer

まずやったのが,cost explorerの有効化.
24hかかるらしいので,今日はenableにしただけ.

server access logging

S3ではバケット単位でアクセスログを取れる.バケットを選択し,Propertiesから有効化する.
保存先バケットは,ログを残すバケットと同じregion内にないといけないらしい.
あと,ログが配信され始めるまで数時間かかるので,こっちも今日はenableにしただけ.

まとめ

突然,AWSの利用料金が増えたので,料金のモニタリングとアクセスのモニタリングを有効化してみた.
原因やフィルタリング条件が明らかになれば,アラートの設定やアクセス制限をしたいと思う.

wordpressをS3 webhostingで公開した時の費用

AWSって費用感が分かりにくい.
なので実際に公開した費用が分かり易いかも知れない.

S3で公開する方法はこちら.WordPressの管理に疲れたので静的ページに落としてS3で公開した話 - hadacchi blog

7月半ばから運用をしていて,8/1~8/19までの19日間ではこんな感じ.
ただし,S3とデータ転送にはowncloud(約800MB)が含まれるので,website運用分は実質,CloudFrontがほとんど.(owncloudはCloudFrontを経由していない)

AWS費用(8/1~8/18)
AWS費用(8/1~8/18)

ざっくり60%強がCloudFront.全てwebsite hosting.
30%弱がデータ転送.ほとんどがownCloudだと思われる.
残り10%弱がS3ホスティング.ほとんどがownCloudだと思われる.

1ヶ月分の予測は単純に1.5倍.

AWS費用(8月予測)
AWS費用(8月予測)

金額にして200円にはならない見込み.
ownCloudを除けば100円くらいと思われる.
うーん,安い.

Integromat で Gmail の特定フォルダのメールを slack に投稿

Integromatというのは,IFTTTとかzapierみたいなwebサービスの連携サービス.
かなり細やかに設定できるというか,もはやプログラミングするような感じで構成しないと動かない.

Gmailをslackに投稿する時のハマりポイント

  1. 日本語の文字化け
  2. 長いとslackに拒否られる

対策

文字列変換してちょんぎる.

手動インストールしたnginxを維持しながらowncloudをupgrade

前提

apache2は2.4で設定が変わった折に捨てた.
nginxはwebdavを使うためやhttp2を使うためなどの理由でdebianのパッケージでは不足であったため公式サイトの安定リリースを手動コンパイルしインストールしている.
owncloudは公式のドキュメント(Install package owncloud, owncloud-files)にあるリポジトリを使用する.

手順

owncloudをリポジトリからapt-getで入れる場合,httpdセクションのパッケージが入っていないと依存関係が問題になる.
owncloud-filesで依存関係を無視して入れるか,ダミーパッケージを作成して依存関係を解決させるかが必要となる.
今回は後者を選択した.

リポジトリ修正
owncloudはメジャーアップデートをスキップすることはできない.
例えば8.1が入っている場合,8.1->8.2->9.0->9.1とアップデートしなければならない.
なので8.2を入れる.
なんかリポジトリのアドレスが変わってたっぽいのでついでに対応する.

@@ -1 +1 @@
-deb http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Debian_8.0/ /
+deb http://download.owncloud.org/download/repositories/8.2/Debian_8.0/ /
更新準備(ダミーパッケージインストール)
まず,
equivsでダミーパッケージを作って入れる.

  1. equivsを入れて
    $ sudo apt-get update && sudo apt-get install equivs
    
  2. 適当なディレクトリでダミーパッケージ作り.
    $ mkdir nginx-dummy && cd nginx-dummy
    $ equivs-control nginx-dummy
    
  3. 設定ファイルの編集
    ただし,php5-cgiは8.2のみ依存関係のため入れている.8.2のアンインストール後,つまり9.0インストール後はphp5-cgiを抜いてインストールし直して良い.(9.0~は依存関係は「php5-cgi | php5-fpm」となっているので)

    @@ -6,14 +6,14 @@
     # Homepage: 
     Standards-Version: 3.9.2
    
    -Package: 
    +Package: nginx-dummy
     # Version: 
     # Maintainer: Your Name 
     # Pre-Depends: 
     # Depends: 
     # Recommends: 
     # Suggests: 
    -# Provides: 
    +Provides: httpd,php5-cgi
     # Replaces: 
     # Architecture: all
     # Copyright: 
    @@ -22,7 +22,7 @@
     # Extra-Files: 
     # Files: 
     #  
    -Description: 
    - long description and info
    +Description: dummy package for nginx
    + dummy package for nginx installed manually.
      .
    - second paragraph
    + nginx-dummy provides httpd and php5-cgi
    
  4. ダミーパッケージを作ってインストール
    $ equivs-build nginx-dummy; sudo dpkg -i nginx-dummy_1.0_all.deb
    
パッケージ更新
で,やっとownCloudを更新する.

$ sudo apt-get update && sudo apt-get install owncloud=8.2
ファイル更新
展開済のowncloudを更新する.

$ cd /var/www/owncloud
$ sudo -u www-data ./occ upgrade
メンテナンスモード終了
動作確認は設定ファイルでmaintenanceをfalseにしないとできない.

@@ -21,3 +21,3 @@
   'updatechecker' => false,
-  'maintenance' => true,
+  'maintenance' => false,
   'theme' => '',
繰り返す
8.2->9.0
9.0->9.1

10.0も出てるけど,9.1はまだサポートされてるし,今回はパス.
と思ったら,9.0もまだサポートされてた.アップデートしすぎた.でもダウングレードはサポートされてないので,9.1で行く.
Maintenance and Release Schedule · owncloud/core Wiki

debian で systemctl で自動起動

あらすじ

systemctl で start とか stop とかできるように /etc/systemd/system/ 以下にサービス定義を置いて安心していたら,自動起動しなかったよ!

それからどーした

sudo systemctl list-unit-files --type=service

nginx.service            disabled

とか出てきたら,サービス定義は生きてるけど自動起動が無効なので,

sudo systemctl enable nginx.service

とかする.

他にも mask/unmask とかハマりポイントなんで,systemctl の man を見て対処する.

sslでエラーが出るのは,SSL証明書の発行元のせいだったよ!

背景

StartSSLで発行した証明書を使用しているサーバ(この鯖でした)へのアクセス時,たまにchromeで証明書エラーが出ていた.
特定のマシンでしかエラーが出ないので,放置していたんだけれども,最近になってfirefoxでもエラーが出るようになり本格的に怪しいと感じるようになったので証明書の発行元について調べてみた.

StartSSL(StartCom)のSSL証明書がiPhoneなどで認識されない問題 | カニとモモンガと愉快なユウ

ダメぢゃん…

はい,発行元,乗り換えるよ!

SSL証明書の発行

乗り換え先として名前がいくつかのサイトで挙がっていた Certbot へ移行することにした.
無料でSSL証明書を発行できるのはメリットだね!

発行手順(debianの場合のみ)

  1. backportsをsources.listに追加して,apt-getでbackportsからインストールできるようにする.
    ここは,どっかのサイトを調べてできるようにしてね.
  2. certbotをインストールする.
    python関連の他の用途では使わないパッケージが色々と入れられるので,可能なら他のホストで実行することをオススメする.
    私の場合,別のVMを立ててポートフォワードを設定変更して(証明書の設定の手順に関係)証明書の発行だけした.

    sudo apt-get install certbot -t jessie-backports
    
  3. 既存のkeyからcsrを作成する.
    注意は,既存サーバと同じホストで実行する場合,既存サーバの443ポートと競合するので,既存サーバを落としておくこと.

    openssl genrsa -aes256 2048 > server.key  # <- 未だ秘密鍵がない場合
    openssl req -new -sha256 -key server.key -out server.csr  # <- 未だ証明書署名要求がない場合
    sudo certbot certonly --standalone --csr server.csr --config-dir . --logs-dir . --work-dir . -d DOMAINNAME
    
  4. dhパラメタの生成.
    openssl dhparam 2048 -out dhparam.pem
    
  5. 証明書を設定する.
    まず,0000_cert.pemが証明書本体.
    0000_chain.pemが中間証明書かルート証明書か,ともかく証明書を連結して使う最近のトレンドで証明書本体と連結すべきやつ.trusted_certificateにも,これを指定する.
    0001_chain.pem上2つの連結証明書.nginxとかはこれを使う.

    ssl_certificate /path/to/0001_chain.pem;
    ssl_certificate_key /path/to/server.key;
    ssl_dhparam /home/hada/sslfiles/dhparam.pem;
    ssl_trusted_certificate /path/to/0000_chain.pem;
    
  6. 鯖を再起動して完了

dovecotを入れてメールのローカル配信をする

インストール

sudo apt-get install dovecot-pop3d dovecot-lmtpd heirloom-mailx postfix
maildirmake.dovecot /var/mail/USERNAME  # Maildir形式の場合

設定

  • /etc/dovecot
    • dovecot.conf
    • conf.d/10-mail.conf
    • conf.d/10-master.conf
    • conf.d/10-ssl.conf
  • /etc/postfix
    • main.cf
  • /etc/aliases
    • 書いたら newaliases を走らせる./etc/aliases のオーナーが /etc/aliases.db と一緒でないとエラーを吐く
  • /etc/mailname

テスト

送信テスト
行中に「.」のみの行が末尾のしるし.

mail USERNAME@HOSTNAME
Subject: Test
this is test
.

受信テスト

mail

nginx のメモ

よく忘れるので,メモ.

設定について

add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
HSTS 設定.SSLでアクセスするようブラウザに指示するHTTPヘッダを追加する.
sendfile
ファイルI/Oにカーネルキャッシュを利用する…らしい
tcp_nopush
ヘッダとデータをチャンクして送信するようになるらしい
tcp_nodelay
パケット転送時に他にまとめられるものがないか,ちょっと待つのを止めさせるらしい
types_hash_max_size
typesのハッシュテーブルの最大サイズ
server_token
レスポンスヘッダに含むサーバの情報について制御する

インストールについて

debianの場合,jessie-backportsで入れれば1.10.3が入る(2017.3時点)ので,自分でコンパイルするのをやめた.
WebDAVをまともに使おうと思った場合,libnginx-mod-http-dav-extを一緒に入れると良い.

起動スクリプトについて

systemctl start nginx.service で PID ファイルに関するエラーが出る場合は,起動スクリプトを修正すると良い.

@@ -20,6 +20,7 @@
 PIDFile=/run/nginx.pid
 ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
 ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
+ExecStartPost=/bin/sleep 0.1
 ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
 ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
 TimeoutStopSec=5

nginx で StartSSL のクライアント証明書を使ったクライアント認証をやる

--- 追記 ここから ---

注意

startsslの証明書が主なブラウザから弾かれるようになりました.
詳しくは,この辺とか→StartSSL の証明書が使い物にならなくなっていた件 | ぴんくいろにっき

個人的には,移行をおすすめします.
私は,2017年4月から別の認証局へ移行しております.

--- 追記 ここまで ---

毎回,認証が表示されるのが面倒臭いので,クライアント認証を導入する.

環境

nginxのバージョンを上げるか,opensslのバージョンを上げるかしないとエラーを吐くので,nginxを1.9.12以降に上げるか(#901 (Changes in openssl master wrt SSL_shutdown()) – nginx),opensslを1.1.0以降に上げる(SSL error NginX 1.9.10

本記事では,試験鯖でnginx公式リポジトリ(Debian 8 (Jessie) - Web サーバ Nginx 構築(Nginx 公式リポジトリ使用)! - mk-mode BLOG)を使用して入れた1.10.2-1と,
jessie-backportsを使用して入れた1.0.2k-1により動作確認することとする.

ちなみに,この鯖はそれらとは環境がまた違います.

nginxのアップデート

ownCloudを入れていてnginxを使っている時にnginx-commonを消すとapache2が入ってしまい,/etc/systemd/system/nginx.service/dev/nullを指すようになってしまったので,/lib/systemd/systemにnginx.serviceを書いて(NGINX systemd service file | NGINX),おまじないを唱える.

sudo systemctl unmask nginx.service

そうすると,systemdで制御できるようになるようなので,service nginx startとかが効く.
nginx.serviceに書いてあるバイナリーのバージョンを確認して,問題なければnginxの設定に入る.

nginxの設定

startsslのログインにクライアント証明書を使ったクライアント認証が必要(最近はメールアドレスへのワンタイムパスがサポートされたけど,昔は証明書を失くしたら二度とログインできなかった)なので,当然インストール済だとして,その証明書を使うことにする.
証明書のsubjectは以下とする.

/description=For login authentication only/CN=mail@address.com/emailAddress=mail@address.com

subjectを確認する方法は

openssl pkcs12 -nokeys -info -in CERTIFICATIONFILE.pfx

とかやる.pkcs12の部分は証明書の形式に応じて変更する.

あとはnginxのserverあたりに設定を書く.
基本的な設定は,この辺を流用すると楽チン.Generate Mozilla Security Recommended Web Server Configuration Files

server {
    listen 443 http2;
    server_name YOURDOMAIN;

    ssl on;
    ssl_verify_client on; # クライアント認証を有効化
    ssl_verify_depth 2;   # 認証局を辿る数

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /path/to/crt/of/your/server.crt;
    ssl_certificate_key /path/to/key/of/your/server.key;
    ssl_client_certificate /path/to/crt/of/your/CA.crt;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;


    # modern configuration. tweak to your needs.
    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this topic first.
    #add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;

    # Path to the root of your installation
    root /path/to/your/document/root;
    index index.php index.htm;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    if ($ssl_client_s_dn !~ "/CN=mail@address.com/emailAddress=mail@address.com")
    {
           return 401;
    }

    # あとは普通の設定と同様
}

ね,簡単でしょ?

ssh セッションを socks proxy として使う

そもそも,ポートフォワーディングとダイナミックフォワーディングがあるが,後者を使うものとする.

コマンドラインの場合

$ ssh HOST -D LOCAL_PORT

これで,ブラウザのproxyを localhost:LOCAL_PORT とかにすれば良い.

configファイルの場合

Host proxy
    User        USERNAME
    HostName    HOST
    DynamicForward  LOCAL_PORT

これで,ssh proxy とかすれば良い.ブラウザの設定は上と一緒.