.php に特定の文字列が入っていた場合に git commit を失敗させる pre-commit hook のサンプル

#!/bin/sh
if git rev-parse –verify HEAD >/dev/null 2>&1
then
against=HEAD
else
# Initial commit: diff against an empty tree object
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
#for FILE in `git diff-index –name-status $against — | grep -E '\.js(\.coffee)?$'| cut -c3-` ; do
# # Check if the file contains 'console.log'
# grep_result=`grep 'console.log' $FILE | grep -v -E '\s*(\#+|\/\/).*console.log' | grep -v '^$' `
# if [ -n "${grep_result}" ]
# then
# echo $FILE ' contains console.log!'
# echo $grep_result
# exit 1
# fi
#done
for FILE in `git diff-index –name-status $against| grep '\.php$'| cut -c3-` ; do
# Check if the file contains 'debugger'
grep_result=`grep '鼻くそ' $FILE | grep -v -E '\s*\#+.*鼻くそ' | grep -v '^$'`
if [ -n "${grep_result}" ]
then
echo $FILE ' contains 鼻くそ!'
echo $grep_result
exit 1
fi
done

インストール方法

$ cd /path/to/git_repo/.git/hooks
$ wget https://gist.githubusercontent.com/wokamoto/d9fa955004231c63a175/raw/71c011ec700a8d36d4e362fb09739b3333b2f434/pre-commit.keyword-check.sample
$ mv pre-commit.keyword-check.sample pre-commit
$ chmod +x pre-commit

これで、php ファイルに ‘鼻くそ’ という文字列が入っている場合に git commit を失敗させることができます。

どうしても、鼻くそが入ったまま commit したい場合は

$ git commit --no-verify

[AWS] awscli と jq でインスタンスタイプの変更を気軽に

awscli, jq が利用できることが前提です。
以下のようなシェルスクリプトを組むだけで、特定のインスタンスのインスタンスタイプを変更できます。
(ついでに EIP の付与も)

#!/bin/sh
AWS_PROFILE='YOUR aws-cli PROFILE HERE'
INSTANCE_ID='YOUR INSTANCE ID HERE'
INSTANCE_TYPE='YOUR INSTANCE TYPE HERE'
PUBLIC_IP='YOUR INSTANCE EIP HERE'
while :
do
EC2_STATE=`aws ec2 describe-instances –profile ${AWS_PROFILE} –instance-ids ${INSTANCE_ID} | jq -r '.Reservations [] .Instances [] .State | .Name'`
if [ $EC2_STATE = 'running' ]; then
aws ec2 stop-instances –profile ${AWS_PROFILE} –instance-ids ${INSTANCE_ID}
fi
if [ $EC2_STATE = 'stopped' ]; then
break
fi
echo "${INSTANCE_ID} : ${EC2_STATE}"
sleep 10
done
aws ec2 modify-instance-attribute –profile ${AWS_PROFILE} –instance-id ${INSTANCE_ID} –instance-type ${INSTANCE_TYPE}
aws ec2 start-instances –profile ${AWS_PROFILE} –instance-ids ${INSTANCE_ID}
while :
do
EC2_STATE=`aws ec2 describe-instances –profile ${AWS_PROFILE} –instance-ids ${INSTANCE_ID} | jq -r '.Reservations [] .Instances [] .State | .Name'`
if [ $EC2_STATE = 'running' ]; then
break
fi
echo "${INSTANCE_ID} : ${EC2_STATE}"
sleep 10
done
EC2_EIP=`aws ec2 describe-instances –profile ${AWS_PROFILE} –instance-ids ${INSTANCE_ID} | jq -r '.Reservations [] .Instances [] .PublicIpAddress'`
if [ $EC2_EIP != $PUBLIC_IP ]; then
aws ec2 associate-address –profile ${AWS_PROFILE} –instance-id ${INSTANCE_ID} –public-ip ${PUBLIC_IP}
fi

view raw
gistfile1.sh
hosted with ❤ by GitHub

[Nginx] CSR の作成と Nginx での ssl 設定 ( ついでに spdy も )

忘れっぽいので残しておきます

// ssl 証明書用の秘密鍵を作る(パスワード設定しておく)
$ openssl genrsa -des3 -out privkey.pem 2048
Generating RSA private key, 2048 bit long modulus
……+++
………………+++
e is 65537 (0x10001)
Enter pass phrase for privkey.pem:
Verifying – Enter pass phrase for privkey.pem:
// 秘密鍵から csr を作成 → 証明局に提出して ssl 証明書をもらう
$ openssl req -new -key privkey.pem -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
—–
Country Name (2 letter code) [XX]:JP → 国コード (必須)
State or Province Name (full name) []:Tokyo → 都道府県名 (必須)
Locality Name (eg, city) [Default City]:Shinjuku → 市町村区 (必須)
Organization Name (eg, company) [Default Company Ltd]: → 会社または組織名 (必須)
Organizational Unit Name (eg, section) []: → 部署名
Common Name (eg, your name or your server's hostname) []: → サーバ名 (必須)
Email Address []: → Email Address
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: → パスワード
An optional company name []:               → 会社または組織名
// 秘密鍵をパスワード無しに変換
$ cp privkey.pem privkey.pem.org
$ openssl rsa -in privkey.pem.org -out privkey.pem
// nginx.conf を修正
$ vi /etc/nginx/nginx.conf
:
server {
listen 443 ssl http2;
server_name _;
root /var/www/html;
index index.html index.htm;
charset utf-8;
ssl on;
ssl_certificate /etc/nginx/ssl.keys/fullchain.pem; # 証明局から取得した ssl 証明書に中間CA証明書をくっつけたやつ
ssl_certificate_key /etc/nginx/ssl.keys/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers AESGCM:HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
# 以下はお好みで
#ssl_stapling on;
#ssl_stapling_verify on;
#ssl_trusted_certificate /etc/nginx/ssl.keys/fullchain.pem;
#resolver 8.8.8.8 8.8.4.4 valid=300s;
#resolver_timeout 5s;

view raw
gistfile1.txt
hosted with ❤ by GitHub

自己証明書を作りたい時は…

$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

p7s から pem に変換

$ openssl pkcs7 -in server.p7s -print_certs

[AWS] AMI 作る前にやっておきたいこと

#!/bin/sh
rm -rf /tmp/*
rm -f /etc/ssh/ssh_host_*
if [ -d /var/log ]; then
find /var/log -type f -print | xargs -L1 /bin/cp /dev/null
fi
if [ -d /var/spool/mail ]; then
find /var/spool/mail -type f -print | xargs -L1 /bin/cp /dev/null
fi
/bin/cp /dev/null /root/.ssh/authorized_keys
/bin/cp /dev/null /root/.bash_history
if [ -f /root/.mysql_history ]; then
/bin/cp /dev/null /root/.mysql_history
fi
if [ -d /home/ec2-user ]; then
/bin/cp /dev/null /home/ec2-user/.ssh/authorized_keys
/bin/cp /dev/null /home/ec2-user/.bash_history
if [ -f /home/ec2-user/.mysql_history ]; then
/bin/cp /dev/null /home/ec2-user/.mysql_history
fi
fi
history -c
echo "clear!"

view raw
clear.sh
hosted with ❤ by GitHub

  • /var/log 以下のファイルを /dev/null で上書き
  • /var/spool/mail 以下のファイルを(略)
  • /root 以下の .ssh/authorized_keys, .bash_history, .mysql_history を(略)
  • (あれば) /home/ec2-user 以下の .ssh/authorized_keys, .bash_history, .mysql_history を(略)
  • /tmp/*, /etc/ssh/ssh_host_* を削除

をやるので、最低限必要なことはこれで足りるはず
参考: cloudpackブログ: 公開AMIを作成する直前で行っていること

せっかちなあなたには

# curl -L clear.ninjax.cc | bash; history -c 

authorized_keys 消すから、この作業やったら、そのインスタンスにはログインできなくなるよ

[WordPress] xmlrpc を利用した踏み台攻撃への対応について

Sucuri で以下の記事が投稿されてから、にわかに注目されてきましたね。
More Than 162,000 WordPress Sites Used for Distributed Denial of Service Attack | Sucuri Blog

コーポレートサイトとかで、そもそも xmlrpc 使ってないよって場合は、Web サーバレベルで追い返しちゃいましょう。

<Files ~ "xmlrpc.php$">
deny from all
</Files>

view raw
apache.conf
hosted with ❤ by GitHub

location ~* xmlrpc\.php$ {
log_not_found off;
return 403;
}

view raw
nginx.conf
hosted with ❤ by GitHub

18:35 追記
ちょっとこのままだとスマートフォンアプリから投稿できなくなっちゃったよママン..とか言う人が出てきそうなので。
xmlrpc は、スマフォアプリなどからの投稿などでも使われます。そのため、全部拒否しちゃうと iOS や Android アプリからの投稿ができなくなったりしますので、IP アドレス制限などと組み合わせて使ってください。

参考

[AWS] リザーブドインスタンスの予約内容が変更可能になってた

おそらくAWS Trusted Advisorのリコメンデーションや同等の機能をもったサードパーティのツールによりガイドされていると思いますが、Amazon EC2のリザーブドインスタンスをうまく利用することにより、キャパシティを確保しつつ、コンピュートのコストを下げることができます。

本日、ニーズが変化した際にリザーブドインスタンスを変更できるようにすることで、リザーブドインスタンス(RI)モデルをより一層柔軟にいたしました。具体的には、同じリージョン内にあるアベイラビリティーゾーン間でRIを移動できるようになりました。もしお持ちのAWSアカウントがEC2-Classiceが有効になっているものでしたら、EC2-ClassicとEC2-VPC間のRIも移動することができます。

【AWS発表】 EC2 リザーブドインスタンスの予約内容を変更可能に

結構、うれしい

WordVolcano From the Dark Side

599374_375424589258870_1636322203_nWordVolcano番外編 – From the Dark Side(黒い画面特集) : ATND

  • 日時 : 2013/11/23 13:30 to 16:30
  • 定員 : 70 人
  • 会場 : 天文館ビジョンホール 6Fホール (鹿児島市東千石町13番3号)

最近劇的にWeb制作の環境が変わりつつあります。そんな中、Webサイトをセキュアに、効率的に運用するためのノウハウを時間いっぱい聞いて、話して、大いに語り合おうと思います!!
サブタイトル通りいわゆる「 黒い画面 」を扱いますが、今後特に デザイナーさんにこそ知って欲しい 内容満載です。
カリッカリにエッジの効いた話が効ける絶好の機会だと思っています。

お時間ありましたら是非お早めにエントリーしてください!!