zuntan02のはてなブログ

備忘録的なものです。時々職場の技術者ブログにも転記してますが、メインはこちらで。

【AWS】AmazonLinux2のyumリポジトリにパッケージが少ない件

【概要】

AWSの新標準AMIと思われるAmazonLinux2について、yumのデフォルトリポジトリ(amzn2-core)
はなんかヤケにパッケージが少ない。
できるだけAWSが用意してくれるリポジトリに従っていきたいので、以下の2段構えで構築した。

1)Nginxなど主要なパッケージは「Extras Library」からインストールする
2)上記にない場合はEPELを追加する

【詳細】

1)Nginxなど主要なパッケージは「Extras Library」からインストールする

提供されているトピック(=ソフトウェア群)一覧を確認

# amazon-linux-extras

  0  ansible2                 available  [ =2.4.2 ]
  1  emacs                    available  [ =25.3 ]
  2  memcached1.5             available  [ =1.5.1 ]
  3  nginx1.12                available  [ =1.12.2 ]
  4  postgresql9.6            available  [ =9.6.6  =9.6.8 ]
  5  postgresql10             available  [ =10 ]
  6  python3                  available  [ =3.6.2 ]
  7  redis4.0                 available  [ =4.0.5  =4.0.10 ]
  8  R3.4                     available  [ =3.4.3 ]
  9  rust1                    available  \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2 ]
 10  vim                      available  [ =8.0 ]
 11  golang1.9                available  [ =1.9.2 ]
 12  ruby2.4                  available  [ =2.4.2  =2.4.4 ]
 13  nano                     available  [ =2.9.1 ]
 14  php7.2=latest            enabled    [ =7.2.0  =7.2.4  =7.2.5 ]
 15  lamp-mariadb10.2-php7.2  available  \
        [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5 ]
 16  libreoffice              available  [ =5.0.6.2_15 ]
 17  gimp                     available  [ =2.8.22 ]
 18  docker=latest            enabled    [ =17.12.1  =18.03.1 ]
 19  mate-desktop1.x          available  [ =1.19.0  =1.20.0 ]
 20  GraphicsMagick1.3        available  [ =1.3.29 ]
 21  tomcat8.5                available  [ =8.5.31 ]

インストール

amazon-linux-extras install nginx1.12
2)上記にない場合はEPELを追加する

ex.Rootkit Hunter

# EPELの有効化
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

# RootkitHunberのインストール
yum install rkhunter

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にしてやればよかった。
ググっても殆どヒットしないのでニッチな情報だと思いますが、誰かの役に立てば。。。