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

UbuntuでCitrix Receiverを使ってVPN越しにRDPする時のtips

firefoxにCA証明書を登録してるのに,証明書がtrustedじゃないよって怒られる時のtips

前提

  • VPNを受けてRDPを受け付けるサーバ側は用意されているものとする.
    勤務先とか勤務先とか勤務先とか
  • 必要な証明書はcrtとかcerとかのファイルがあるものとする

手順

  1. firefoxをインストール.ubuntuのdesktopを入れてたら最初から入ってるかも
  2. Citrix Receiverをインストール.
  3. 証明書をインストール
    • 個人証明書
    • サーバ証明書
  4. 指定されたURLにアクセスして認証を通す
  5. ここで,Citrix Receiverに怒られる場合,firefoxのcertをCitrixが読めるようリンクを貼る
    sudo ln -s /usr/share/ca-certificates/mozilla/* /opt/Citrix/ICAClient/keystore/cacerts
  6. それでもダメな場合,firefoxに取り込めてない可能性があるので直接コピっちゃう
    sudo cp /path/to/cert.crt /opt/Citrix/ICAClient/keystore/cacerts

    1. 証明書がちゃんと入っていたら,ブラウザのセッションは維持したまま,icaを落とし直してreceiverを起こし直せば動く

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. 鯖を再起動して完了

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

DD-WRTをイーサネットコンバータとして使う

client bridge - toshi_hirasawaの日記 を参考にしつつ,
私が使っているものは日本語化されてたり v24-sp2だったりという差分があったので一部補足しながら.

前提

DD-WRT化は済とする.
wl0はAPとして,wl1はClientとして設定する.

構成

+-----+          +----------+                     +--------+                     +-------------+
| HGW +-[Ether]--+ WNDR4300 | < < < [Wi-Fi] < < < | DD-WRT | < < < [Wi-Fi] < < < | smart phone |
+-----+          +----------+                     +----+---+                     +-------------+
                                                       |              +----+
                                                       +---[Ether]----| PC |
                                                                      +----+

DD-WRTの構成

Firmware
DD-WRT v24-sp2 (08/07/10) std

準備

  • 接続環境 (複数経路を用意してバックアップ)
    • 作業用端末からwl0のwifiに接続できるようにする.
    • 作業用端末からDD-WRTの有線LANポートに接続できるようにする.
  • DD-WRTのアドレス固定
    • 基本タブ
      • 基本タブ
        • LAN側接続の項目を自宅内で有効な固定アドレスに設定する.
      • VLAN タブ
        • 全て同一VLANに設定する.

設定

  1. 無線LAN タブ
    1. 基本 タブ
      • wl1のMAC動作モードを「Client Bridge」にする
      • ネットワーク名(SSID)をWNDR4300のSSIDにする
    2. 無線LANセキュリティ タブ
      • wl1の無線LAN認証以下の設定を,WNDR4300とアソシエートできるように設定する
  2. セキュリティ タブ
    1. Firewall タブ
      • Firewall保護のSPI Firewallを「無効」
  3. 基本タブ
    1. 経路 タブ
      • 動作モードを「RIPv2」にする
      • Bird config Styleは「Vtysh」のままでOKだった
      • インターフェースは「LAN&WLAN」のままでOKだった
    2. 基本 タブ
      • スイッチにインターネット側ポートを設定するのチェックボックスを外す
      • この時点(設定ボタンを押した後?)でインターネット接続方法は選択できなくなっており,「無効」になっているはず

こんな感じで,NAT/NAPTなしでイーサネットコンバータとして動作するようになっているはず.
右上のステータスには「WAN: 無効」と出ているはず.

ed25519で公開鍵認証

sshの鍵をrsaをやめてed25519にしてみたことについて.
オープンサーバにSSHで入れるようにして,色々な国からのハッキングっぽいアクセスログが残っている現状を鑑みれば,とりあえず強化しておくに越したことはないよね,っつー話.
あと,RSAの鍵長を伸ばして行くと,ログインにちょっと時間がかかる気がしており,ed25519はrsaより短い鍵長で同程度の強度を誇るらしいので,ちょっとは公開鍵認証の処理が早くならんかしらと期待しているのもある.

実行速度とかは,この辺を参照→自堕落な技術者の日記 : RSAとECDSA、署名生成と署名検証どっちが速い? - livedoor Blog(ブログ)

鍵の生成

とりあえずデフォルトで.

$ ssh-keygen -t ed25519 -C 'comment'

今んところできないのか,原理的なものによりできないのか,とりあえずビット長の指定はきかない.
できあがる鍵は ~/.ssh/id_ed25519[.pub]

CUDA on Ubuntu

ただのメモなんで,読み解いて使ってね

nouveauと競合

  • Ubuntu desktopをnvidiaボード搭載マシンに入れると,標準でnouveauが入るが,CUDAを動作させられないので外さないといけない
  • Nouveauを入れたままNVIDIAプロプライエタリドライバを入れると,Xが起動しなくなった
  • Nouveauを消すとX関連が依存関係によりまとめて消えた
    • 二度手間になるので,minimumから入れた方が早いかも

プロプライエタリドライバ導入

  • http://www.nvidia.co.jp/Download/index.aspx?lang=ja
    $ sudo ./NVIDIA-Linux-x86_64-XXX.XX.run

    上のURLから,カードに合ったバージョンが入手できるはず
    この手順のあとに,lightdmなどX環境を入れる

CUDA導入

  • https://developer.nvidia.com/cuda-downloads
  • deb (local) でやってみる
    $ sudo dpkg –i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb
    $ sudo apt-get install nvidia-prime nvidia-XXX.XX-updates-dev
    
  • 念のため,関連ドライバを改めて入れてみた
    $ sudo apt-get update
    $ sudo apt-get install --upgrade nvidia-settings
    $ sudo apt-get install cuda
    

PythonでOSのPingコマンドを叩いて死活監視する

ここを参考にしたのだが,うまく動かなかった→[Python] Pingコマンド実行 : Edo::World::Blog
上のサイトのスクリプトでは,pingコマンド自体のエラーを見ているため,存在しないFQDNなどを指定した場合にはpingがIPアドレスを引けないことからエラーを返す.
つまりDNSが設定されていないホスト名の検出になっている.
一方で,pingコマンドを使用する通常のケースでは,たとえばあるセグメント配下の全IPアドレスにpingを飛ばすなどの作業を行なう.
この場合,例えばDestination Host Unreachableを返す場合であっても,pingコマンド自体は正常に完了するため,コマンドのエラーではDestination Host Unreachableを検出できない.
ということで,ちょっとだけ手を入れて検出できるようにした.

#!/usr/bin/python
# vim: fileencoding=utf-8

import subprocess

class Ping(object):
    def __init__(self, hosts):
        loss_pat='0 received'
        msg_pat='icmp_seq=1 '
        for host in hosts:
            ping = subprocess.Popen(
                ["ping", "-c", "1", host],
                stdout = subprocess.PIPE,
                stderr = subprocess.PIPE
            )
            out, error = ping.communicate()
            msg = ''
            for line in out.splitlines():
                if line.find(msg_pat)>-1:
                    msg = line.split(msg_pat)[1] # エラーメッセージの抽出
                if line.find(loss_pat)>-1: # パケット未到着ログの抽出
                    flag=False
                    break
            else:
                flag=True # breakしなかった場合 = パケットは到着している
            if flag:
                print('[OK]: ' + 'ServerName->' + host)
            else:
                print('[NG]: ' + 'ServerName->' + host + ', Msg->\'' + msg + '\'')


if __name__ == '__main__':
    hosts=map(lambda x:'xxx.xxx.xxx.'+str(x),range(1,255))
    Ping(hosts)

Webサーバのログを眺めてみよう

この記事を書いた頃は,apacheを使っていたが,今では使っていない.「apache のエラーログを真面目に読んでみた | hadacchi blog
存在しないURLを適当に入れたら出てしまうから書いちゃうけど,このウェブサイトは,nginxを使って運営している.

で,まぁそのログを眺めようという前回に引き続いての企画.
思いも寄らぬエラーが出てたりするので,勉強になると思うよ.

access.log
  • 標準だと,多分/var/log/nginx/access.logあたりだと思う.
    生で見てもいいんだけど,アタックによく使われるphpmyadminあたりへのアクセスをひっかけるため,こんなコマンドでまずはIPとリクエストURL,サーバのレスポンスコード,ユーザエージェントを一覧する.

    # cut -d' ' -f1,7,9,12-  nginx/access.log | grep dmin | less

    そもそも,ここで200になっていたら,phpmyadminのログとか見た方がいいと思う.
    私は使ったことがないから知らない.

  • 次は,そこでひっかかったIPアドレスをひっかけて,他にヤバそうなアクセスを受けていないか確認する.
    # cut -d' ' -f1,7,9,12-  nginx/access.log | grep xxx.xxx.xxx.xxx | less

    そうすると,例えばこんなURLへのリクエストが飛びまくっていたので,この辺りに脆弱性のあるプログラムがあるんだろーなー,とか分かる.

    /w00tw00t.at.blackhats.romanian.anti-sec:)
    /muieblackcat
    /components/com_jinc/classes/graphics/php-ofc-library/ofc_upload_image.php?name=magic.php
    

    ぐぐってみると,1つ目と2つ目はよくひっかかる.
    3つ目は,なんかopen flash chartとかいうのが出てくる.
    あと,明らかにSMTPを狙ったログも出てきた.

    CONNECT 126mx00.mxmail.netease.com:25 HTTP/1.0

    ぐぐってみると,中国語っぽいサイトが出てくる.
    アクセス元IPアドレスをIP-HOST変換かけてドメインでぐぐると,台湾からのアクセスらしいという情報も出てくる.

error.log
基本は,access.logと同じだが,nginxの場合はphpへのアクセスを全てphp-fpmへ流していると,php-fpmからのエラーも全部記録される.
設置していないURLでの*.phpへのアクセスは,別にさばいてログを分けた方がいい…のかな?まだ考え中.
他には,設置をミスった証明書のエラーとかも出てくる.

# grep -v 'No such file or directory' nginx/error.log | less
php-fpm.logとか,unicorn.logとか
phpとかrubyとか使ってると,この辺りもチェックすることになると思う.pythonならuwsgi.logとかかしら.
この辺りを動かしている人は,自分の環境に併せて調べてみてね.

Redmine on Debian がアップデートでごちゃごちゃしたので整理

追記:
最近はrbenv+ruby-buildが流行りらしい.apt-getで入るけど,それで入れたら入れられるrubyは古いものしかなかった.

前提:サーバで動作している rubygems, ruby 系は全部消した上で,autoremove した状態.
それまで動いていた,redmine の環境はいじってない.

ruby
rvmでインストールする.
環境が整っていれば,webにあるように

root# curl -L https://get.rvm.io | bash -s stable

でいいんだけど,最初はうまくいかないので,インストール用のシェルスクリプトを落としてきて何度も実行することになる.

$ wget -L https://get.rvm.io
$ cat index.html | bash -s stable

そうしたら色々と足りないものを入れろと言われる.
RedmineをDebianに導入する - Qiita を見て入れたものは,これら.
make環境が入ってたので,少なめ.

root# apt-get install git
root# apt-get install libssl-dev
root# apt-get install libreadline-gplv2-dev
root# apt-get install libyaml-dev
root# apt-get install curl

んで,もういっかい,

$ cat index.html | bash -s stable

そしたら環境を読み込んでrubyを入れる.

$ source $HOME/.rvm/scripts/rvm
$ rvm install x.x.x # <- 入れたいバージョン

この辺りで,rootになってないことに気付いたけど,$HOME/.rvm 以下にインストールされてたので,いいやと思うことにする.

$ rvm list

として,インストールされたrubyが出てきたらOK.

mysql関連gems
これはスキップできなかった.

$ sudo apt-get install libmysqlclient-dev
$ gem install mysql2
bundler
$ gem install bundler --no-rdoc --no-ri

これでローカルに入るはず.

redmine用のgems
なんか gemset とか使って,環境を切り替えられるらしいんだけど,使わないことにする.

$ cd /path/to/redmine
$ bundle install --without development test postgresql sqlite3 rmagick

なぜか,sqlite3 はインストールされてしまう…

起動スクリプト
source コマンドでスクリプトを読み込めるbashにする.

#!/bin/bash
source /home/username/.rvm/scripts/rvm
cd /path/to/redmine
bundle exec unicorn_rails -D -E production -c config/unicorn.rb