ApacheのServerヘッダが出ないようにする

Apacheのレスポンスヘッダで出てくるServerヘッダを隠すにはどうしたら良い?

と聞かれた際のメモ。

環境

OS : CentOS 7.5

Apache2.4.34

デフォルトのレスポンス

curlコマンドでレスポンスを見てみると以下のようになります。

$ curl -I -s localhost
HTTP/1.1 200 OK
Date: Wed, 19 Jun 2019 09:27:07 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Wed, 19 Jun 2019 06:00:40 GMT
ETag: "41-58ba6f2f16016"
Accept-Ranges: bytes
Content-Length: 65
Content-Type: text/html; charset=UTF-8

Serverヘッダがみえてバージョン情報やOSの情報が見えてるのをセキュリティ的に非表示にしたいですようね。

バージョン情報とOSの情報を隠す

httpd.conf のファイルの中身をいじって非表示にしていきます。

# 設定ファイルの場所
$ sudo vi /etc/httpd/conf/httpd.conf

#書き込む内容
ServerSignature Off
ServerTokens ProductOnly

# 再起動
$ systemctl restart httpd

内容を書き込んでcurlコマンドでレスポンスをかくにんすると以下のようになります.

$ curl -I -s localhost
HTTP/1.1 200 OK
Date: Wed, 19 Jun 2019 09:28:28 GMT
Server: Apache
Last-Modified: Wed, 19 Jun 2019 06:00:40 GMT
ETag: "41-58ba6f2f16016"
Accept-Ranges: bytes
Content-Length: 65
Content-Type: text/html; charset=UTF-8

バージョン情報とOSの情報が隠れていることが確認できました。

セキュリティ的にはここまで隠せていれば十分だと思います。

Serverヘッダを隠す

本記事の本題になります。Apacheのバージョンが2.2より前のものであれば、mod_headersをインストールして(デフォルトで入っていることが多い)設定ファイルに以下のように書き込めば隠せていたようです。

Header unset Server

Apache のバージョンが 2.2 ~ 2.4 のものに関しては上記設定で Server ヘッダが隠せなくなってしまっているので、Apache WAF である mod_security を使用することで隠すことができるようになります。

mod_security のインストール

以下のコマンドでインストールを行います。

yum -y install mod_security mod_security_crs

設定ファイルの書き込み

Server ヘッダの内容を隠すにあたってhttpd.confとmod_security.confの内容を変更していきます。

# httpd.confの中身を編集
$ sudo vi /etc/httpd/conf/httpd.conf

# 以下をコメントアウト
# ServerSignature Off
# ServerTokens ProductOnly

# 以下を書き込む
ServerTokens Full

# mod_security.confの中身を編集
$ sudo vi /etc/httpd/conf.d/mod_security.conf

# 以下をコメントアウト
# SecRuleEngine On

# 以下を書き込む
SecServerSignature " "

# 再起動
$ systemctl restart httpd

mod_securtyを使用してServerヘッダを隠す際にはServerTokenの設定をFullにしないと設定が有効にならないみたいです。

ここまで設定をしたらcurlコマンドでレスポンスを見てみましょう。

$ curl -I -s localhost
HTTP/1.1 200 OK
Date: Wed, 19 Jun 2019 09:30:59 GMT
Server:  
Last-Modified: Wed, 19 Jun 2019 06:00:40 GMT
ETag: "41-58ba6f2f16016"
Accept-Ranges: bytes
Content-Length: 65
Content-Type: text/html; charset=UTF-8

無事に内容が隠れていることが確認できると思います。

余談ですが、ServerSignature の中身に違うサーバの名前等を書くとサーバの詐称もできます。 

 

Amazon Linux から PostgreSQLへの接続

システムいじる際に忘れやすいので, メモとして.

接続コマンド

psql -h [エンドポイント] -U [Username]  -d [DB NAME]

エンドポイントは RDS の AWS コンソールから確認する.

無事に接続できたらOK.

接続できないとき

接続できないときには、エンドポイント等の情報があっているか確認しましょう.

それでもだめなときはセキュリティグループが原因だったりすることが多いので確認しましょう.

 

 

 

Trelloの内容をスプレッドシートに書き込む

自分は業務のタスク管理で Trello を使用しているのですが, チームメンバーからタスクがどうなってるかチェックしたいと言われた際に行ったメモ.

GSuite を使っているので, せっかくなので Trello の内容をスプレッドシートにうつしていく.

Trello API

今回は Google Apps Script からTrello API を使用してスプレッドシートに連携させていきます.

そのため、まず Trello APIAPI key と API token を入手しましょう.

まず Trello にログインをします.

ログイン後にAPIキー取得ページより、キーとトークンを取得しましょう.

f:id:shsm385:20190531150637p:plain

APIキー取得画面

上記のような画像のページに飛びます. 灰色の部分に各々の API キーが書いてあります.

同じページ内にトークンの取得リンクへ飛べるものがあるので, API token も入手します.

スプレッドシート作成

スプレッドシートを新しく作成して, 「ツール」> 「スクリプトエディタ」より Google Apps Script のエディタ画面を開きます.

f:id:shsm385:20190531151211p:plain

プロジェクト名とGASの表記を適当に定めてからコードを書いていきます.

Google App Script

Trello API に必要な変数を作成します.

API を叩いた結果は JSON 形式で返ってきます.

var user = 'username';
var api_key = 'api_key';
var api_token = 'api_token';
var board_id = 'boad_id';

user の変数は今回 ボードの名前を取得する際に使います. Trello のユーザ名に当てはまります. 

次に Board の名前を取得する関数を作ります.

function getBoardsName() {
  var url = 'https://api.trello.com/1/members/' + user + '/boards?key=' + api_key + '&token=' + api_token + '&fields=name';
  var res = UrlFetchApp.fetch(url, {'method':'get'});
  var json = JSON.parse(res.getContentText());
  return json[0].name;
}
次に List の名前を取得する関数を作ります.
function getListsName() {
  var url = "https://trello.com/1/boards/" + board_id + "/lists?key=" + api_key + "&token=" + api_token + "&fields=name";
  var res = UrlFetchApp.fetch(url, {'method':'get'});
  var json = JSON.parse(res.getContentText());
  var namelist = [];
  for(var i = 0; i < json.length; i++){
    namelist.push(json[i].name);
  }
  return namelist;
}

次に Card の名前を取得する関数を作ります.

function getCardsName() {
  var url = "https://trello.com/1/boards/" + board_id + "/lists?key=" + api_key + "&token=" + api_token + "&fields=name&cards=open&card_fields=name";
  var res = UrlFetchApp.fetch(url, {'method':'get'});
  var json = JSON.parse(res.getContentText());
  var cardlist = [];
  for(var i = 0; i < json.length; i++){
    var card = json[i].cards;
    var cardnum = json[i].cards.length;
    cardlist[i] = {};
    for(var j = 0; j < cardnum; j++){
      cardlist[i][j]=card[j].name;
    }
  }
 return cardlist;
}

ここまでできたら, いい感じにスプレッドシートに表示できるように記入していきます.

function saveTask(){
  clear();
  const sheet = SpreadsheetApp.getActiveSheet();
  var row = 1;
  var colum = 1;
  var namelist = getListsName();
  var cardlist = getCardsName();
  var cell_board = sheet.getRange(row, colum).setValue(getBoardsName());
  setBoardDesign(sheet,cell_board)
  for(var i=0; i<namelist.length; i++){
    var cell_list = sheet.getRange(row + 1, colum).setValue(namelist[i]);
    setListDesign(sheet, cell_list);
    colum = colum + 1;
    if(i === namelist.length - 1){
      colum = 1;
    }
  }

  for(var i=0; i<Object.keys(cardlist).length; i++){
    var obj = new maxSize();
    obj.setmaxSize(0);
    for(var j=0; j<Object.keys(cardlist[i]).length; j++){
      Logger.log(cardlist[i][j])
      var cell_card = sheet.getRange(row + 2, colum).setValue(cardlist[i][j]);
      setCardsDesign(sheet,cell_card,obj);
      row = row + 1;
      if(j === Object.keys(cardlist[i]).length - 1){
        row = 1;
      }
    }
    sheet.getColumnWidth(colum);
    colum = colum + 1;
  }
}

ここまででスプレッドシートに Trello に保存した内容が表示されるようになっていると思います.

ついでにデザインを整えていくと次のような感じで完成になります. 

f:id:shsm385:20190531155440p:plain

後は GAS を実行する時間設定をして 1時間に一度更新するといった感じにしておくとある程度の頻度で更新できます.

完成品のコードは以下のURLから.

https://github.com/shsm385/Trello2spredsheet


 

 

  

CompTIA Security+ (SY0-501) に合格した話

会社の方針で CompTIA の Security+ を受ける機会があって無事合格できました。その時の勉強のお話。

 

Security+とは?

アメリカのシカゴにある  CompTIA さんの提供しているベンダー資格の1つ。 提供しているベンダー資格には他に Server+ や Network+ などがある。

オフィシャルぺページ(日本語版)の説明だと以下のような力の証明になるらしいです。

CompTIA Security+は、セキュリティに特化したワールドワイドの認定資格です。脅威や脆弱性の分析、セキュリティを考慮したネットワーク設計、リスクマネジメントやアイデンティティ管理などのスキルを網羅する認定資格です。
セキュリティ関連業務の2年程度の実務スキルを評価します。

セキュリティに関して一通り網羅されている感じですね。

受験料

公式ページを見ると¥42,936 で受けられます。ベンダー試験なので高いですね。

自分は公式代理店になっている TAC さんで提供されているバウチャーチケット付きのもので受験を行いました。

バウチャーチケットがあると、本試験に近い問題がでる模擬試験を受けることができるのでお得です。

また、キャンペーンで一度落ちてももう一度受験できるといったものをやっていることもあります。

勉強法

Amazon等で 書籍も売っていますが、自分はひたすらにバウチャーチケットについている模試を9割以上とれるように1週間勉強しました。

公式試験範囲を見ると以下の画像のようになっているので、自分の苦手分野を中心に勉強しました。普段あまり仕事でかかわらない分野であるリスク管理アーキテクチャと設計を中心にわからない単語等を覚えていきました。

f:id:shsm385:20190529102231p:plain

公式試験範囲より

 テクノロジーや脅威など全体的にインフラよりの知識が多かった気がします。

試験について

試験の内容は主に選択問題が7割くらいで、図を使った問題が3割ほど出ていました。 

上にも書きましたが、インフラ寄りの内容が全体的に多かった気がします。

受験した感想

バウチャーチケットの模試から7割くらいは似たような(ほぼ同じ)問題がでている感じでした。自分は約800点くらいで合格しました。合格ラインはだいたい750点以上(8割以上)なので合格ラインちょっと上くらいでした。

模試を9割くらい取れるようにしておけばほぼ合格できるのに闇を感じますね。

自分はセキュリティ業務に入って半年くらいで受けたので基本的に必要な知識に関してだいたい得ることができたので受けてよかったかなと思いました。

気が向いたら他の資格も受けてみます。

 

【AWS】EC2でインスタンスを立てた際の初期設定メモ

AWS の EC2 でサーバーを立てたときに最初にやることのメモ.

環境

OS : Amazon Linux 2

パッケージのアップグレード

以下のコマンドでソフトウェアをアップデートしていく.

$ sudo yum update -y

ユーザの作成

$ sudo su -
$ passwd

root のユーザに切り替えて、パスワードを設定します.

$ adduser username

セキュリティ面を考えるとデフォルトのユーザを使っているのは怖いので, adduser コマンドで新しいユーザを作りましょう.

$ passwd username

パスワードを設定しましょう.

$ usermod -G wheel username

新しく作ったユーザに sudo の権限をつけて上げましょう.

$ grep wheel /etc/group
wheel:x:10:ec2-user,username

作ったユーザが sudo 権限を持つ group に入っていることを確認しましょう.

$ su - username
$ sudo id
uid=0(root) gid=0(root) groups=0(root)

sudo 権限がついているか id コマンドで確認しましょう.

新規ユーザのSSH設定

$ su - username
$ echo 'username ALL = NOPASSWD: ALL' | sudo tee --append /etc/sudoers.d/cloud-init

/etc/sudoers.d/cloud-initに設定を記入します.

$ sudo rsync -a /home/ec2-user/.ssh/authorized_keys ~/.ssh/

ec2-user の authorized_keys を username の .ssh ディレクトリにコピーします.

$ sudo chown -R username:username ~/.ssh
$ sudo chmod -R go-rwx ~/.ssh

パーミッションを変更します.

$ sudo ls -la ~/.ssh/
total 4
drwx------ 2 username username  29 Mar  6 07:16 .
drwx------ 3 username username  74 Mar  6 07:16 ..
-rw------- 1 username username 388 Mar  6 05:53 authorized_keys

パーミッションの確認.

ユーザの削除

$ sudo userdel ec2-user

新しくユーザを作ったので、デフォルトのユーザを削除します.

$ sudo vi /etc/ssh/sshd_config
# DenyUsers ec2-user を追加
$ sudo systemctl restart sshd.service

もしくは SSH でのログインを禁止しましょう.

時刻の設定

EC2 は初期の時刻の設定が UTC になっているので日本に変更します.

$ date
Wed Mar  6 05:25:37 UTC 2019

date コマンドで確認

$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ date
Wed Mar  6 14:26:31 JST 2019

変更を行って確認

$ sudo vi /etc/sysconfig/clock

ZONE="Asia/Tokyo"
UTC=true

$ sudo systemctl restart crond.service

clock の中身の設定を変更して cron を再起動.

バックアップ用のコマンドを入れる

ファイルのバックアップがほしいときがあるので、以下を導入する.

ファイルをbackupするコマンドの作成 - <%@ しまむーの備忘録 %>

コマンドのログ

サーバー上でいつどんなコマンドをうったのか知りたいので、個人的に同様に以下を導入.

自分でつかったコマンドのログを取る - <%@ しまむーの備忘録 %>

 

とりあえずここまで. 

サーバーのセキュアな設定をもっと知りたい....

 

MySQLの文字コードをUTF-8に変更

PHPからPDOを使用してMySQLに接続する際に、文字コードの関係で日本語が表示できないことがあったので, その際の設定メモ. 

環境

OS : CentOS 6

PHP7.2.12

MySQL5.1.71

 MySQLの設定

show variables like '%char%';

上記コマンドでデータベースの文字コード設定を確認します.

f:id:shsm385:20190220181319p:plain

文字コードが latin1 になっていることが確認できます.

今回は文字コードutf-8 に変更していきます.  /etc/my.cnf という設定ファイルから変更を行います.

[mysqld]
# [mysqld] の最後尾部分に追記
character-set-server=utf8

# 追記
[client]
default-character-set=utf8

上記の設定を追加してmysql server を再起動させます.

f:id:shsm385:20190220182121p:plain

再起動を行ったら, データベースの文字コードをもう一度確認します.

f:id:shsm385:20190220182403p:plain

PHPでの文字コードの指定

$db['host'] = 'localhost';
$db['user'] = 'user';
$db['pass'] = '*************';
$db['dbname'] = 'db name';

$dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8', $db['host'], $db['dbname']);
      try{
        $pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
        $sql =  "select * from tablename";
        $stmt = $pdo->query($sql);
        foreach($stmt as $res){
           print_r($res);
        }
        $stmt->closeCursor();
      }catch(PDOException $e){
        $errormsg = 'Error Database';
        $e->getMessage();
      }

上記コードの charset='' の部分で文字コードの指定を行います.

 

自分はMySQLのバージョンが5.1.71なので, 使えませんでしたが, 5.3 から "utf8mb4"が使用可能なので、そちらで設定したほうがよさそう.

 

ファイルをbackupするコマンドの作成

AWS上でサーバーを運用するときに、ファイルをバックアップするコマンドがほしかった時のメモ.

 

 ソースコード

#!/bin/bash

LANG=C

T=$(echo $1 | sed 's/\/$//')
cp -a $T $T.$(date +%Y%m%d%H%M%S)
if [ $? -ne 0 ] ; then
    echo "FAILED" >&2
    exit 1
fi
exit 0

上記を .bash_profile に書き込む, もしくはディレクトリの中のどこかにファイルを作ってpathを通す.