zuntan02のはてなブログ

備忘録的なものです

Nginxで拡張子指定で静的ファイルをキャッシュするときの注意

nginxの設定例で、以下のようにして静的ファイルをブラウザにキャッシュさせる記述を見かける

server {
  ~
        location ~ .*\.(jpg|jpeg|gif|png|css|js|ico|woff) {
          expires 1h;
        }
}

ただ、この正規表現だと、[.js*]がマッチしてしまうため
hoge.json.php
とか
fuga.js.php
といったようなphpファイルが静的ファイルとして扱われてしまい、実行されない(ダウンロードされてくる)。
具体的には、WebPushツールのOneSignalのWordpressプラグインにそういうのがあった
(参考:https://wordpress.org/plugins/onesignal-free-web-push-notifications/

明示的に拡張子であることを表現するため、末尾のメタ文字($)をつけて

server {
  ~
        location ~ .*\.(jpg|jpeg|gif|png|css|js|ico|woff)$ {
          expires 1h;
        }
}

とすると、hoge.json.phpはサーバサイドで動作(ダウンロードされない)します。


※念のため、変更後、jpgやjsなどについてはレスポンスヘッダの
Cache-Control: max-age=xxxx(expires 1hなら3600)を確認しておいてください

Webプッシュ通知解除(PCブラウザ)

【参考】

https://blog.izooto.jp/disable-web-push-notifications/

Chrome

1)Chromeで右上メニューボタン→[設定]→[詳細設定]→[コンテンツの設定](chrome://settings/contentへの接続でも可)を表示
2)[通知]で許可している通知を[削除]

FireFox

1)Firefoxで右上メニューボタン→[オプション]→[プライバシーとセキュリティ]→[通知]の[設定]で[通知の許可]を表示
2)ウェブサイトを選択して[ウェブサイトを削除]でクリア、変更を保存

■Edge

1)Edgeで右上メニューボタン→[設定]→[詳細設定を表示]→[Webサイトのアクセス許可]を表示
2)[通知]で許可している通知を[×]でクリア

【nginx】Basic認証したサイトでapple iOSアプリをOTA配布するときに何度もbasic認証出て辛いのでUA見てOFFにする

【前提】

https://hogehoge/install/以下に

  • index.html→ダウンロードページにplistへのリンクを設定してある
ex. <a href="itms-services://?action=download-manifest&url=https://hogehoge/install/hogehoge.plist">install app</a>
  • hogehoge.plist
  • hogehoge.ipa

が入っている。
Webサーバはnginx、かつ/install以下はBasic認証により保護される

【発生した問題】

単純に/install以下をbasic認証とした場合、
index.htmlでBasic認証→hogehoge.plistでBasic認証→hogehoge.ipaBasic認証、と3回もID/PWの入力が必要となる。
アクセスログを見ると以下のようになっている

"GET /install/index.html HTTP/1.1" 401 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS(略)"
"GET /install/hogehoge.plist HTTP/1.1" 401 "-" "itunesstored/1.0 (略)"
"GET /install/hogehoge.ipa HTTP/1.1" 401 "-" "com.apple.appstored/1.0(略)"

最初(index.html)のbasic認証の後、そのままではplistとipaの取得時にそれぞれ別のクライアントからの接続があるため、Basic認証の承認状態が引き継がれずに都合3回ID/PWの入力が必要となる。

このため、UAを見て

  • itunesstored
  • com.apple.appstored

に前方一致なら許可とした。


【hogehoge.conf】

server {
    # port
    listen       443;
(中略)
     # for install pages
     set $auth "Restricted";
     if ($http_user_agent ~ (itunesstored|com.apple.appstored)) {
         set $auth off;
     }

     location ^~ /install {
          auth_basic $auth;
          auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
          root /path/to/root/;
     }
(中略)
}

UAを偽装されてしまうとどうしようもないけど、まあこんなもんかな……

【iOSとSSL】iOSのsafariで特定のサイトを開こうとすると「ページが開けません」となる

【概要】

nginxにLet'sEncryptでSSLを設置したサーバーにiOSSafariで接続すると
「ページを開けません。ネットワーク接続が切れました」
f:id:zuntan02:20180523190217p:plain
となった。勿論インターネットには接続している。

同じサイトに対して

などでは普通に表示できる。iOSのみだめ。

【やったこと】

■表示できなかった

server {
    listen 443;
    server_name hogefuga.jp;
    ssl on;

    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE

    # Let's Encrypt
    ssl_certificate     /etc/letsencrypt/live/hogefuga.jp/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/hogefuga.jp/privkey.pem;

    root /srv/www/hogefuga/;
    index  index.php index.html index.htm;
}


■表示できるようになった

server {
    listen 443;
    server_name hogefuga.jp;

    # SSL Settings
    ssl on;
    ssl_session_cache   shared:SSL:10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    ssl_ciphers  'ECDH !aNULL !eNULL !SSLv2 !SSLv3';

    #HTTP Strict Transport Security
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';

    # Let's Encrypt
    ssl_certificate     /etc/letsencrypt/live/hogefuga.jp/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/hogefuga.jp/privkey.pem;

    root /srv/www/hogefuga/;
    index  index.php index.html index.htm;
}

iOSSSLに厳しい模様。

ZabbixでCloudWatchの値を取得する

【概要】

aws-sdkを利用して、ELBやRDSをzabbixで監視する
zabbixの外部チェック機能を利用する

【参考】

aws-sdk-coreを利用して、ELBやRDSをzabbixで監視する | システム運用日記
↑ほぼここの内容のコピペですが、実行インスタンスにロールに権限がついてない場合、または別AWSアカウントで稼働しているzabbixから別のAWSアカウントの持つCloudWatchを監視するために、zabbixアカウントが利用するcredentialsに複数profileを書いて利用できるよう、一部追加しました

https://qiita.com/ryo0301/items/39308a5dc457b5df59ee
https://qiita.com/kenjiskywalker/items/2c29f8f532880cb81aef
https://gist.github.com/yokota-shinsuke/7350559
https://qiita.com/bakira/items/3a4876cbb39f9a7ec3b8

【作業ログ】

#Zabbixサーバにて以下のモジュールを導入
gem install aws-sdk-core

# aws-sdkのバージョン3ではうまく動かない模様。aws-sdk(v2)を追加でインストール
gem install aws-sdk -v "~>2"

gem list
(抜粋)
# aws-sdk (2.11.33)
# aws-sdk-core (3.19.0, 3.6.0, 2.11.33)
# aws-sdk-resources (2.11.33)

実行アカウントの設定

# ※複数のAWS認証情報を利用する場合は、profile機能を利用する
# aws hogehoge --profile ${profile}

AWS Management Console

# CloudWatch用IAMユーザ作成
ユーザ名:zabbix
AWSアクセスの種類:プログラムによるアクセス
グループ:CloudWatch(CloudWatchFullAccess)←とりあえずテストなのでこれくらいの権限で

zabbixサーバで認証情報登録

# zabbixユーザにbashを設定する

mkdir /var/lib/zabbix
cp -p /etc/skel/.bash_profile /var/lib/zabbix/

# zabbixアカウント用のアクセスキー等を配置

sudo -u zabbix aws configure
# AWS Access Key ID [None]: hogehoge
# AWS Secret Access Key [None]: fugafuga
# Default region name [None]: ap-northeast-1
# Default output format [None]:json
複数アカウントを利用できるようにプロファイルを用意しておく

vi /var/lib/zabbix/.aws/config

[profile awshoge]
output = json
region = ap-northeast-1

[default]
region = ap-northeast-1

vi /var/lib/zabbix/.aws/credentials

[awshoge]
aws_access_key_id = hogehoge
aws_secret_access_key = fugafuga

[default]
aws_access_key_id = XXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXX

zabbixから実行する cloud_watch を作成

vi /usr/lib/zabbix/externalscripts/cloud_watch

#!/usr/bin/ruby

require 'rubygems'
require 'aws-sdk'
require 'optparse'

params = ARGV.getopts(
  "",
  "region:",
  "profile:",
  "namespace:",
  "metric:",
  "dimension_name:",
  "dimension_value:",
  "statistics:",
  "unit:"
)


creds = Aws::SharedCredentials.new path: '/var/lib/zabbix/.aws/credentials', profile_name: params['profile']
Aws.config[:credentials] = creds

cw = Aws::CloudWatch::Client.new(
    :region => params['region'],
)

resp = cw.get_metric_statistics(
    namespace: params['namespace'],
    metric_name: params['metric'],
    dimensions: [
        {
            name: params['dimension_name'],
            value: params['dimension_value'],
        },
    ],
    start_time: Time.now - 300,
    end_time: Time.now,
    period: 300,
    statistics: [params['statistics']],
    unit: params['unit'],
)

    data = resp[:datapoints]
    last_stats = data.sort_by{ | stat | stat[:timestamp]}.last

        if last_stats.nil? then
                exit
        else
        p last_stats[params['statistics'].downcase.to_sym].to_i
    end

chmod 755 /usr/lib/zabbix/externalscripts/cloud_watch

# テスト実行

sudo -u zabbix /usr/lib/zabbix/externalscripts/cloud_watch --region ap-northeast-1 --namespace AWS/RDS --metric CPUUtilization --dimension_name DBInstanceIdentifier --dimension_value ホスト名 --statistics Average --profile awshoge

zabbixWebUIから設定

例:CPUUtilization

1.設定→テンプレート→テンプレートの作成ボタンを押下
ホスト名:RDS-awshoge
(そのほかはデフォルトのまま)にして作成

3.設定→テンプレート→「RDS-awshoge」の「アイテム 」リンクを押下
[アイテムの作成]にて

名前:RDS CPU Usage
タイプ:外部チェック
キー:cloud_watch["--metric","CPUUtilization","--dimension_name","DBInstanceIdentifier","--dimension_value","{HOST.NAME}","--statistics","Average","--namespace","AWS/RDS","--region","ap-northeast-1","--profile","awshoge"]
データ型:数値(浮動小数)
単位:%
更新間隔(秒):60
として作成

これで値が取れるようになりました。

【AmazonLinux+Mattermost4.8.0】初期プラグイン(ZOOM/JIRA)が有効にならない件

【問題】

[システムコンソール]-[プラグイン(ベータ版)]-[設定]で有効にしてもプラグインがつかえない。
インストールされていないのかと思ってtgz拾ってきてアップロードしようとすると「プラグインは無効化されています」と言われる。
アプリケーションログ(/opt/mattermost/log以下)を見ると

[2018/04/04 19:42:05 JST] [EROR] failed to start up plugins: mkdir ./client/plugins: no such file or directory
[2018/04/04 19:42:06 JST] [EROR] /api/v4/plugins:GetPlugins code=501 rid=(中略) Plugins have been disabled. [details: ]

みたいなログ。

【解決】

vi /etc/init.d/mattermost

SERVICE=mattermost
start() {
    cd /opt/mattermost/bin
    sudo -u mattermost ./platform > /dev/null &
    echo "service $SERVICE [start]"

を以下の様に変更

SERVICE=mattermost
start() {
    cd /opt/mattermost/
    sudo -u mattermost ./bin/platform > /dev/null &
    echo "service $SERVICE [start]"
}

【情報】

https://github.com/mattermost/docs/blob/master/source/administration/plugins.rst
曰く
the working directory for the service running Mattermost is not correct.
This can be fixed on Ubuntu 16.04 and RHEL by opening the service configuration file and setting WorkingDirectory to the path to Mattermost, often /opt/mattermost.

mattermost.log見ると

[2018/04/04 19:47:46 JST] [INFO] 現在のワーキングディレクトリーは/opt/mattermost/binです

なので、最初のcdを/opt/mattermostにしてやればよかった。
ググっても殆どヒットしないのでニッチな情報だと思いますが、誰かの役に立てば。。。

AmazonLinuxにRootkitHunter導入したメモ

【参考】

https://sys-guard.com/post-15162/
(ここほぼそのまま)

【作業メモ】

RootkitHunterのインストール

yum install rkhunter

Installed:
  rkhunter.noarch 0:1.4.2-0.9.amzn1
rootkithunterのセキュリティデータベースアップデート

以下に示す

rkhunter --propupd
rkhunter --update

を実行したらエラーが出たりしたので、/etc/rkhunter.confファイルで回避した。

cp -p /etc/rkhunter.conf /etc/rkhunter.conf.org
vi /etc/rkhunter.conf 
→(中略)
→変更後変更内容確認
diff /etc/rkhunter.conf /etc/rkhunter.conf.org
587c587
< # SCRIPTWHITELIST=/usr/bin/GET
---
> SCRIPTWHITELIST=/usr/bin/GET
590d589
< XINETD_ALLOWED_SVC=/etc/xinetd.d/xproftpd


→設定ファイルを編集したら、「rkhunter --propupd」を実行

システムファイルの情報アップデート

rkhunter --propupd

[ Rootkit Hunter version 1.4.2 ]
File created: searched for 170 files, found 144
検知対象情報アップデート

rkhunter --update

[ Rootkit Hunter version 1.4.2 ]

Checking rkhunter data files...
  Checking file mirrors.dat                                  [ No update ]
  Checking file programs_bad.dat                             [ Updated ]
  Checking file backdoorports.dat                            [ No update ]
  Checking file suspscan.dat                                 [ Updated ]
  Checking file i18n/cn                                      [ No update ]
  Checking file i18n/de                                      [ Updated ]
  Checking file i18n/en                                      [ No update ]
  Checking file i18n/tr                                      [ Updated ]
  Checking file i18n/tr.utf8                                 [ Updated ]
  Checking file i18n/zh                                      [ Updated ]
  Checking file i18n/zh.utf8                                 [ Updated ]

初回チェック

rkhunter -c --rwo --sk

-c チェック
--sk エンターキー要求をスキップ
--rwo 警告のみ表示
定期実行スクリプトの設置

vi /hoge/rkhunter.sh

#!/bin/sh

## -------------------------------
MAILTO=hoge@fugafuga.com
## -------------------------------

MAILBODY=`mktemp /tmp/temp.XXXXXX`

# rootkit判定データベース更新
/usr/bin/rkhunter --update > /dev/null 2>&1

# チェック実行 異常があればメールを行う
/usr/bin/rkhunter -c --sk --cronjob --rwo 2>&1 > $MAILBODY
if [ -s $MAILBODY ]; then
    mail -s "[Rootkit Hunter] `hostname` `date +%Y-%m-%d`" $MAILTO < $MAILBODY
fi

rm -f $MAILBODY
実行権限をつけて実行
chmod +x /hoge/rkhunter.sh
sh /hoge/rkhunter.sh

# 証明書の自動更新 1日1回
crontab -e

10 4 * * * /srv/bin/rkhunter.sh > /dev/null 2>&1