dehio3’s diary

仕事、生活、趣味のメモ

ibwww-perl レスポンス(response)オブジェクトの復帰コードがバージョンによって違った

事象

URLの存在チェックする処理にて、バージョンが変わるとHTTPステータスコード200から403に変わってしまった。

チェックスクリプト

#!/usr/bin/perl

use strict;
use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)');
$ua->timeout(5);

my $url = '<チェックしたいURL>';

my $req = HTTP::Request->new(GET => $url);
my $res = $ua->request($req);

#print $res->as_string();

print $res->status_line . "\n";
print $res->code . "\n";

$ perl http_status.pl
200 OK
200

$ perl http_status.pl
403 Forbidden
403

環境

perl

$ perl -version

This is perl, v5.8.5 built for x86_64-linux-thread-multi

Copyright 1987-2004, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'.  If you have access to the
Internet, point your browser at http://www.perl.com/, the Perl Home Page.
$ rpm -qa | grep libwww-perl
perl-libwww-perl-5.79-5

$ perl -version

This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
(with 29 registered patches, see perl -V for more detail)

Copyright 1987-2012, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
$ rpm -qa | grep libwww-perl
perl-libwww-perl-6.05-2.17.amzn1.noarch

対処

agentの指定を無効化した

#$ua->agent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)');

agentの指定しない場合のagentは?

libwww-perlのバージョンが設定される

 [06/Jun/2017:14:47:32 +0000] "GET /index.html HTTP/1.1" 200 - "-" "libwww-perl/6.05"
[06/Jun/2017:14:51:13 +0000] "GET /index.html HTTP/1.1" 200 - "-" "libwww-perl/5.805"

実際のブラウザからのアクセスを想定した動作にしたいのでagentは設定する。

無効化するとスパム扱いされる可能性あるから設定したい。

ブラウザからアクセスした場合のヘッダー情報と、スクリプトからのアクセスした場合のヘッダー情報を比較して

色々試した結果以下を追加したら成功した。

$ua->default_header('accept-encoding' => 'gzip,deflate');

あとSSLのサイトで、ブラウザはOKだけどスクリプトNGだった奴は以下を追加して対応

$ua->ssl_opts(verify_hostname => 0);

にひりずむ::しんぷる - LWP での SSL 接続で certificate verify failed しちゃう件の解決方法

詳細はまた後日。。。

公開ファイルが文字化ける

事象

  • ブラウザ上にて公開しているファイルの文字が文字化けして表示される。
  • ファイルのOS上の文字コードShift_JIS

環境

OS

# cat /etc/system-release
Amazon Linux AMI release 2017.03

apache

# /usr/sbin/httpd -V
Server version: Apache/2.2.31 (Unix)
Server built:   Jul 19 2016 00:11:31
Server's Module Magic Number: 20051115:40
Server loaded:  APR 1.5.1, APR-Util 1.4.1
Compiled using: APR 1.5.1, APR-Util 1.4.1

ファイルの文字コード

# nkf -guess hoge.txt
Shift_JIS (LF)

OSの文字コード

# cat /etc/sysconfig/i18n
LANG=ja_JP.UTF-8

Response Header の確認

Accept-Ranges:bytes
Content-Length:169
Content-Type:text/plain; charset=UTF-8
Date:Mon, 05 Jun 2017 02:52:32 GMT
ETag:"138-a9-550f427692dc0"
Last-Modified:Fri, 02 Jun 2017 06:20:47 GMT
Server:Apache/2.2.31 (Amazon)

Content-TypecharsetUTF-8に指定されている。

対処

httpd.conf の AddDefaultCharset を無効化

# grep AddDefaultCharset /etc/httpd/conf/httpd.conf
#AddDefaultCharset UTF-8

変更後のResponse Header

Accept-Ranges:bytes
Connection:close
Content-Length:169
Content-Type:text/plain
Date:Mon, 05 Jun 2017 03:00:02 GMT
ETag:"138-a9-550f427692dc0"
Last-Modified:Fri, 02 Jun 2017 06:20:47 GMT
Server:Apache/2.2.31 (Amazon)

charsetの指定が解除され、ブラウザが自動で判定した文字コードで表示された。

AddDefaultCharset とは?

  • レスポンスのコンテントタイプが text/plain あるいは text/html の場合に追加するデフォルトの charset パラメータ

core - Apache HTTP サーバ バージョン 2.2

ansible dynamic inventory ec2

目的

  • aws上に作成したec2に対して、全台に一括でコマンド操作を行う。
  • 動的インベントリを利用する事で、ec2の情報を常に最新の情報取得する。

Dynamic Inventory — Ansible Documentation

インベントリ用ディレクト作成

mkdir ec2_command ; cd ec2_command
mkdir hosts ; cd hosts

動的インベントリ用ファイル取得

wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.py
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini

ec2.ini 修正

  • 利用しているリージョンに書き換える
regions = all
regions_exclude = ap-northeast-1

ec2リスト取得

$ ./ec2.py --list
ERROR: "Authentication error retrieving ec2 inventory.
 - No AWS_ACCESS_KEY_ID or AWS_SECRET_ACCESS_KEY environment vars found
 - Boto configs found at '~/.aws/credentials', but the credentials contained may not be correct", while: getting EC2 instances

credentialsファイルは存在し正しく設定してるのにこける。

どうやら時刻のずれが原因のよう。

blog.ozacc.com

確かに時間ずれてる&ntpd動いてない。

$ /etc/init.d/ntpd status
ntpd は停止しています
$ chkconfig | grep ntp
ntpd            0:off   1:off   2:off   3:off   4:off   5:off   6:off
ntpdate         0:off   1:off   2:off   3:off   4:off   5:off   6:off

時刻を合わせる

$ sudo /etc/init.d/ntpd start
ntpd を起動中:                                             [  OK  ]

再度実行

$ ./ec2.py --list

脆弱性の番号って何?

最近「Apache Struts2」の脆弱性の問題がよくニュースで流れる。

itpro.nikkeibp.co.jp

そのなかで出てくる以下の数字

脆弱性(S2-045、CVE-2017-5638)

これって何を表してるのかよくわかってなかった。

なので今回はこの数字が何の情報なのかを調べてみた。

CVE-2017-5638

  • CVEとは、Common Vulnerabilities and Exposures(共通脆弱性識別子)の略称
  • 米国政府の支援を受けた非営利団体のMITRE社が提供している脆弱性情報データベース
  • 識別番号 「CVE-ID」(CVE-登録時の西暦-通し番号の形式)
  • CVE識別番号管理サイト CVE - Common Vulnerabilities and Exposures (CVE)
  • CVE識別番号管理サイトでは、CVE-IDの情報としてNVDのリンクがある

NVD(National Vulnerability Database)

CVSS(Common Vulnerability Scoring System)

  • 情報システムの脆弱性に対するオープンで汎用的な評価手法
  • ベンダーに依存しない共通の評価方法を提供

(1) 基本評価基準 (Base Metrics)

情報システムに求められる3つのセキュリティ特性、「機密性( Confidentiality Impact )」、「完全性( Integrity Impact )」、「可用性( Availability Impact )」に対する影響を、ネットワークから攻撃可能かどうかといった基準で評価し、CVSS基本値( Base Score )を算出

  • 脆弱性の固有の深刻度を表すために評価する基準
  • この基準による評価結果は固定 (時間の経過や利用環境の異なりによって変化しない)

(2) 現状評価基準 (Temporal Metrics)

脆弱性の現在の深刻度を評価する基準です。攻撃コードの出現有無や対策情報が利用可能であるかといった基準で評価し、CVSS現状値( Temporal Score )を算出

  • 脆弱性への対応状況に応じ、時間が経過すると変化
  • ベンダーや脆弱性を公表する組織などが、脆弱性の現状を表すために評価する基準

(3) 環境評価基準 (Environmental Metrics)

製品利用者の利用環境も含め、最終的な脆弱性の深刻度を評価する基準です。攻撃を受けた場合の二次的な被害の大きさや、組織での対象製品の使用状況といった基準で評価し、 CVSS 環境値 (Environmental Score) を算出

  • この基準による評価結果は、脆弱性に対して想定される脅威に応じ、製品利用者毎に変化
  • 製品利用者が脆弱性への対応を決めるために評価する基準

CVSSのレベル

CVSS基本値により深刻度をレベル分けする

レベルIII (危険)7.0~10.0
  • リモートからシステムを完全に制御されるような脅威
  • 大部分の情報が漏えいするような脅威
  • 大部分の情報が改ざんされるような脅威
レベルII (警告)4.0~6.9
  • 一部の情報が漏えいするような脅威
  • 一部の情報が改ざんされるような脅威
  • サービス停止に繋がるような脅威
レベルI (注意)0.0~3.9
  • 攻撃するために複雑な条件を必要とする脅威
  • その他、レベルIIに該当するが再現性が低いもの

参考サイト

ASCII.jp:脆弱性情報のサイトでよく目にする「CVE」とは?

共通脆弱性評価システムCVSS概説:IPA 独立行政法人 情報処理推進機構

CVSSスコアの解説「セキュリティ診断結果の見方」 | 株式会社レオンテクノロジーはWebサイトを守るセキュリティ会社です

CUI実行環境構築

CUIでの実行環境構築

以下の手順を参考に環境を作成

tech-sketch.jp

テストコードを実行したところ以下のエラーが発生

# ruby /tmp/selenium_test.rb
/var/lib/gems/2.3.0/gems/selenium-webdriver-3.2.2/lib/selenium/webdriver/common/service.rb:59:in `binary_path':  Unable to find Mozilla geckodriver. Please download the server from https://github.com/mozilla/geckodriver/releases and place it somewhere on your PATH. More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver. (Selenium::WebDriver::Error::WebDriverError)
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.2.2/lib/selenium/webdriver/common/service.rb:49:in `initialize'
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.2.2/lib/selenium/webdriver/firefox/w3c_bridge.rb:33:in `new'
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.2.2/lib/selenium/webdriver/firefox/w3c_bridge.rb:33:in `initialize'
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.2.2/lib/selenium/webdriver/common/driver.rb:52:in `new'
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.2.2/lib/selenium/webdriver/common/driver.rb:52:in `for'
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.2.2/lib/selenium/webdriver.rb:87:in `for'
    from /tmp/selenium_test.rb:3:in `<main>'

Mozilla geckodriver をダウンロードしろとのこと

# cd /usr/loca/src
# wget https://github.com/mozilla/geckodriver/releases/download/v0.14.0/geckodriver-v0.14.0-linux64.tar.gz

# tar -zxvf geckodriver-v0.14.0-linux64.tar.gz
geckodriver

# ls -l
total 7256
-rwxrwxr-x 1 ubuntu ubuntu 5593244 Jan 31 17:14 geckodriver
-rw-r--r-- 1 root   root   1832331 Jan 31 17:15 geckodriver-v0.14.0-linux64.tar.gz

# mv geckodriver /usr/local/bin/
# ls -l /usr/local/bin/geckodriver
-rwxrwxr-x 1 ubuntu ubuntu 5593244 Jan 31 17:14 /usr/local/bin/geckodriver

テスト再実行…OK

# ruby /tmp/selenium_test.rb
Google

CentOS5(python2.4)にAWS CLIを導入する。

環境

OS

$ cat /etc/redhat-release
CentOS release 5.5 (Final)

python

2.4.3がインストール済み

$ rpm -qa | grep python-2
python-2.4.3-27.el5_5.3
libxml2-python-2.6.26-2.1.2.8.el5_5.1

目的

  • 本番環境で動作しているサーバでAWSを操作する要件が出たので、AWS CLIを導入する。
  • AWS CLI を使用するために Python 2.6.3 以上が必要だが、元々インストールされているバージョンが2.4.3 のため、現状の動作に影響を与えないようにpython 2.6.9 を導入する。

方法

既存の動作に影響を与えず上位のバージョンのpythonを導入するためpyenvを使用。

導入については以下を参考に。

pyenvの使い方とインストール - Python入門から応用までの学習サイト

今回は、バージョン検証のためではないため、どのユーザでも参照できるように/usr/localにpyenvを導入する。

pyenv実行に必要なパッケージ取得

yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel -y

Common build problems · pyenv/pyenv Wiki · GitHub

pyenv取得

$ cd /usr/local
$ git clone https://github.com/yyuu/pyenv.git

環境変数設定

$ echo 'export PYENV_ROOT="/usr/local/pyenv"' >> /usr/local/pyenv/.pyenv_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> /usr/local/pyenv/.pyenv_profile
$ echo 'eval "$(pyenv init -)"' >> /usr/local/pyenv/.pyenv_profile
$ source /usr/local/pyenv/.pyenv_profile

インストールリスト表示

pyenv install -l

python2.6.9インストー

$ pyenv install 2.6.9
Downloading Python-2.6.9.tgz...
-> https://www.python.org/ftp/python/2.6.9/Python-2.6.9.tgz
Installing Python-2.6.9...
patching file setup.py
Hunk #1 succeeded at 354 (offset 9 lines).
patching file ./configure
patching file ./Modules/readline.c
Hunk #1 succeeded at 199 (offset -7 lines).
Hunk #2 succeeded at 705 (offset -44 lines).
Hunk #3 succeeded at 852 (offset -7 lines).
Hunk #4 succeeded at 855 with fuzz 2 (offset -63 lines).
patching file ./setup.py
Hunk #1 succeeded at 1698 (offset 23 lines).
patching file ./Lib/ssl.py
patching file ./Modules/_ssl.c
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
Installing pip from https://bootstrap.pypa.io/get-pip.py...
Installed Python-2.6.9 to /usr/local/pyenv/versions/2.6.9

以下が出た場合はコンパイラが無いので yum install gcc -y を実行

configure: error: no acceptable C compiler found in $PATH

インストール確認

$ pyenv versions
* system (set by /usr/local/pyenv/version)
  2.6.9

利用バージョン変更

$ python -V
Python 2.4.3
$ pyenv global 2.6.9
$ pyenv versions
  system
* 2.6.9 (set by /usr/local/pyenv/version)
$ python -V
Python 2.6.9

pipインストー

$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1558k  100 1558k    0     0  3879k      0 --:--:-- --:--:-- --:--:-- 5665k
$ python get-pip.py
DEPRECATION: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of pip will drop support for Python 2.6
Requirement already up-to-date: pip in ./.pyenv/versions/2.6.9/lib/python2.6/site-packages
$ which pip
~/pyenv/shims/pip

既に入ってた。

awscliインストー

$ pip install awscli
$ which aws
~/.pyenv/shims/aws

メモ

pythonの仕組み

virtualenv - def __mopemope__(self, *args, **kwargs):

pythonは自分自身のパスの上位のlib/pythonx.xをライブラリとして認識する。

$ which python
/usr/bin/python
$ ls -l /usr/bin/python
-rwxr-xr-x 2 root root 8304 11月 12  2010 /usr/bin/python
$ ls -ld /usr/lib/python2.4/
drwxr-xr-x 3 root root 4096 11月 12  2010 /usr/lib/python2.4/

読み込んでるライブラリのパス

$ /usr/bin/python -c "import sys;print sys.path"
['', '/usr/lib/python2.4/site-packages/simplejson-2.1.2-py2.4.egg', '/usr/lib/python2.4/site-packages/jsontools-0.1-py2.4.egg', '/usr/lib64/python24.zip', '/usr/lib64/python2.4', '/usr/lib64/python2.4/plat-linux2', '/usr/lib64/python2.4/lib-tk', '/usr/lib64/python2.4/lib-dynload', '/usr/lib64/python2.4/site-packages', '/usr/lib64/python2.4/site-packages/Numeric', '/usr/lib64/python2.4/site-packages/gtk-2.0', '/usr/lib/python2.4/site-packages']

参考

Python パッケージ管理技術まとめ (pip, setuptools, easy_install, etc)

pyenvの使い方とインストール - Python入門から応用までの学習サイト

CentOS release 6.3 (Final)でansible実行環境を作成

デフォルトのバージョン

# python --version
Python 2.6.6
# pip list
-bash: pip: command not found

pipインストール

pipは入ってないので、インストールする。

pipインストールのpythonスクリプトを取得。

# wget https://bootstrap.pypa.io/get-pip.py
# ls -l
total 1492
-rw-r--r--. 1 root root 1524722 2016-05-21 23:30 get-pip.py

スクリプト実行。

# python get-pip.py

バージョン確認。

# pip -V
pip 8.1.2 from /usr/lib/python2.6/site-packages (python 2.6)

インストール直後のリスト。

# pip list
DEPRECATION: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of pip will drop support for Python 2.6
argparse (1.4.0)
iniparse (0.3.1)
pip (8.1.2)
pycurl (7.19.0)
pygpgme (0.1)
setuptools (28.1.0)
urlgrabber (3.9.1)
wheel (0.29.0)
yum-metadata-parser (1.1.2)
yum-presto (0.4.4)

botoインストール

ansibleでのAWS制御のためにbotoをインストール。

# pip install boto
Successfully installed boto-2.42.0

ansibleインストール

パッケージ確認。

# yum list ansible
Loaded plugins: fastestmirror, presto
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Error: No matching Packages to list

デフォルトのリポジトリには存在しないので、EPELリポジトリを追加。

# yum localinstall http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

再度パッケージ確認。

# yum list ca-certificates
Loaded plugins: fastestmirror, presto
Loading mirror speeds from cached hostfile
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again

mirrorlistをhttpに変更。

qiita.com

# sed -i 's/\(mirrorlist=http\)s/\1/' /etc/yum.repos.d/epel.repo

再度パッケージ確認。

# yum list ansible
Loaded plugins: fastestmirror, presto
Loading mirror speeds from cached hostfile
epel/metalink                                                       | 5.5 kB     00:00
 * base: ftp.iij.ad.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
epel                                                                | 4.3 kB     00:00
epel/primary_db                                                     | 5.9 MB     00:00
Available Packages
ansible.noarch                              2.1.1.0-1.el6                              epel

ansibleインストール

# yum install ansible

バージョン確認。

# ansible --version
ansible 2.1.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

playbook 実行

実行するplaybookはこちら。

dehio3.hatenablog.com

クレデンシャル情報を設定。

$ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXX
$ AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXX

playbook実行。

$ ansible-playbook playbook.yum -i hosts

作成完了。