はじめに
手動でログローテートを行いたい時があるので、その対応。
手順
logrotate -d /etc/logrotate.d/syslog
-vオプションを追加すると詳細が表示される 手動実行する際は-fで実行する
logrotate -f /etc/logrotate.d/syslog
手動でログローテートを行いたい時があるので、その対応。
logrotate -d /etc/logrotate.d/syslog
-vオプションを追加すると詳細が表示される 手動実行する際は-fで実行する
logrotate -f /etc/logrotate.d/syslog
Datadogを使用していると、ログにアクセスできないパーミッションエラーが発生することがあります。このエラーは、Linuxで一般的なものです。解決するには、/var/log/syslogを参照できるようにする必要があります。
以下のコマンドを使用して、/var/log/syslogにアクセスできることを確認します。
# ls -l /var/log/syslog -rw-r----- 1 syslog admin 79639 Jan 2 9:09 /var/log/syslog
DatadogのエージェントのUID/GIDを確認し、セカンダリーグループ(admin)に追加します。グループを上書きしないように注意してください。
# id dd-agent uid=113(dd-agent) gid=118(dd-agent) groups=118(dd-agent)
仮に-aを忘れてしまうと、所属しているグループを上書きしてしまいます。
usermod -aG admin dd-agent
# id dd-agent uid=113(dd-agent) gid=118(dd-agent) groups=118(dd-agent),4(admin)
これで、Datadogからログを取得できるようになります。
awsであればファイル置き場にS3を使うことも多いだろう。
s3への転送したい場合はaws s3 cpコマンドを使うことが多い。 似たようなことをGCPでCloud Storageに対して行いたいことがある。
ローカルからファイルをコピーする場合 gsutilコマンドを利用する
gsutil cp /tmp/hogehoge gs://bucket/dir/
削除する場合は
gsutil rm gs://bucket/dir/hogehoge
オフィシャル情報はこちら https://cloud.google.com/storage/docs/gsutil?hl=ja
ちなみにプログラム(Python)に組み込む際はこちら https://tsukada.sumito.jp/2018/11/20/gcp-python-cloud-strage-upload/
Jsonは正式にコメント欄というのがない。しかしコメント重要。なんとかする
“` hjson “` を導入する。
hjsonは正式にはjsonではないが、コメントついたjson。ちゃんとしたjsonにするには、変換コマンドを通すことにより、正式なjsonへ変換が可能。
前提条件としてnodeがインストールされていることが必須。
npm install hjson -g
hjsonファイルを用意する
[ { /* email (tsukada@sumito.jp) */ "name": "mailAddress", "type": "STRING" }, { /* realname (TSUKADA SUMITO) */ "name": "realName", "type": "STRING" }, { /* nickname (Smith) */ "name": "nickname", "type": "STRING" }, { /* day (2013/08/03 15:11:00) */ "name": "recordDay", "type": "TIMESTAMP" }, { /* some plans */ "name": "Plan", "mode": "REPEATED", "type": "RECORD", "fields": [ { "name": "optionID", "type": "INTEGER" }, { "name": "optionName", "type": "STRING" } ] } ]
hjsonコマンドでコメントが外れる
[ { "name": "mailAddress", "type": "STRING" }, { "name": "realName", "type": "STRING" }, { "name": "nickname", "type": "STRING" }, { "name": "recordDay", "type": "TIMESTAMP" }, { "name": "Plan", "mode": "REPEATED", "type": "RECORD", "fields": [ { "name": "optionID", "type": "INTEGER" }, { "name": "optionName", "type": "STRING" } ] } ]
リダイレクトをしてコメントを省いたjsonフォーマットに変換することが可能
hjson -j sample.hjson > sample.json
https://co.bsnws.net/article/131
zabbixやcloudWatchのような”ちゃんとした監視”ではなく、本当にシンプルな値だけを監視して、敷地を超えた場合は通知のみしたいことがある。今回はdisk使用量のみを監視するスクリプトを作った。
disk使用率は60%を超えた場合、通知する簡易シェル
$ df -h ファイルシス サイズ 使用 残り 使用% マウント位置 devtmpfs 484M 56K 484M 1% /dev tmpfs 494M 0 494M 0% /dev/shm /dev/xvda1 493G 302G 191G 62% /
通知の部分は以下の記事を流用する。
https://tsukada.sumito.jp/2018/11/27/chatwork/
sshでserverにログインし、dfコマンドでxvda1をgrep、必要なところをawkで取得し、sedで%を削除。
その値をtestコマンドで比較し、true(閾値超え)であればchatworkへ通知する処理がこちら。
10 12 * * 1-5 test $(/usr/bin/ssh server df | /usr/bin/grep xvda1 | /usr/bin/awk '{print $5}' | /usr/bin/sed -e 's/\%//g') -gt 60 && sh /usr/local/src/server-disk.sh
単純にプロセスを監視して、プロセスが落ちてたら起動する処理はこちら
* * * * * ps ax |grep -v grep | grep -q sample.sh || sh /bin/sample.sh
プログラムからchatを送信したい事がある。chatworkはAPIを公開している ( http://developer.chatwork.com/ja/endpoint_rooms.html ) ので比較的簡単に実装できる。
コマンド一発でなんとかなる
_roomid
_body
_token
は適宜設定した後、以下のcurlコマンドを実施
curl -X POST -H "X-ChatWorkToken: ${_token} -d "body=${_body}" "https://api.chatwork.com/v2/rooms/${_roomid}/messages"
簡易的な監視などを
#!/bin/bash cat << _EOT_ > /tmp/msg.txt [info] [title] DISK is over 85%! [/title] Too dangerous, Please fix it. [/info] _EOT_ _roomid=1234567890 _body=`cat /tmp/msg.txt` _token=abcdefghijkl12345678 curl -X POST -H "X-ChatWorkToken: ${_token} -d "body=${_body}" "https://api.chatwork.com/v2/rooms/${_roomid}/messages" exit 0
_roomid、_tokenは環境にあわせ適宜入力する。
ここ数年、nginxを使う企業も増えて来た。今回はnginxのアクセス制御についてまとめる
例えばDoS攻撃。Firewallで止めるのが一般的だが、Nginxで止めたい時もある。
その場合、拒否したいIPを先に書いて、allow allで締める。
location / { # block below IPs deny 123.11.12.3; deny 10.1.2.3; allow all; }
allowを先に書いて、deny allで締める。
location / { # block below IPs allow 123.11.12.3; allow 10.1.2.3; deny all; }
Nigixで複雑な制御をしたいときがある。 例えばnginxでIPもしくはuseragentでアクセス制限などだ。 set関数を使うと、if文のように管理しやすい
nginxの設定ファイルで以下のように設定 123.12.1.1[2-9]のIPであれば許可 もしくはUseragentがFireFoxの場合はベーシック認証をかける設定
server { set $allow_ip 0; if ($http_x_forwarded_for ~ ^123\.12\.1\.1[2-9]$){ set $allow_ip 1; } set $fx 0; if ($http_user_agent ~ FireFox){ set $fx 1; } set $conditions "${allow_ip}${fx}"; location / { if ($conditions = 00){ return 403; } if ($conditions = 01){ set $auth_basic "basic auth"; } auth_basic $auth_basic; auth_basic_user_file "/etc/nginx/himitsu.htpasswd"; }
ローカルのファイルをCloud Strageへファイルをアップロードしたい。今回はpythonを利用することにする
インストールから利用開始まで
実は公式ドキュメント(https://cloud.google.com/python/)が簡潔にまとまってるw
pip install google-cloud-storage
して
import os import google.cloud.storage # Create a storage client. storage_client = google.cloud.storage.Client() # TODO (Developer): Replace this with your Cloud Storage bucket name. bucket_name = 'Name of a bucket, for example my-bucket' bucket = storage_client.get_bucket(bucket_name) # TODO (Developer): Replace this with the name of the local file to upload. source_file_name = 'Local file to upload, for example ./file.txt' blob = bucket.blob(os.path.basename(source_file_name)) # Upload the local file to Cloud Storage. blob.upload_from_filename(source_file_name) print('File {} uploaded to {}.'.format( source_file_name, bucket))
を作り、該当箇所を適宜変更するだけでファイルのアップロードが可能。
embulkでmysqlへ接続しデータを抽出しようとした際、以下のようなエラーが発生し取得できなかった
The server time zone value 'Asia/Tokyo' is unrecognized or represents more than one time zone.
デフォルトのタイムゾーンの設定に誤りがある。1つ以上設定されてある?
embulkのconfigのinのところに以下のオプションを追加
options: {useLegacyDatetimeCode: false, serverTimezone: Asia/Tokyo}
以降問題発生せず、対応完了
脆弱性スキャンツールから攻撃されることが度々ある。Nginxでその攻撃を防ぐ。
access logをみると、useragentに”OpenVAS”というのが記されていた。nginxを使っている場合、このuseragentを403 errorにさせることにした
serverディレクティブに設定を追加する。
もしhttp_user_agentにopenVASが含まれていたら 403 にさせる。という設定
server { if ( $http_user_agent ~* (OpenVAS) ) { return 403; }
この設定を入れた後nginxを再起動させるのみ
もちろんuseragentを偽装されてしまえばこの対応では防げないが、デフォルトのuseragentから来ることが多いので、大半のアタックは防ぐことができる。