TOP ▲ itcore TOPTIPSlog_put.php  タグ:api ログサーバ basic認証 ip制限 php シェル curl

REST API でログサーバを作る。 | itcore 2017年

複数のサーバの管理情報をDBとして集めたいニーズは良くあります。
しかしそのためにFireWallや各種の通信設定をするのは面倒です。(サーバが増える毎に設定が必要)
そこで、ログサーバにHTTP(S)経由のREST APIを用意して、各サーバからそれを叩くと、簡単にサーバ情報を集中管理することができます。
セキュリティとしてBASIC認証とアクセス元IPで制限をかけています。

ログサーバ REST-API log_put.php

<?php
//------------------------------------------------------
$self_id = 'log_put';
$mode = uForm("mode");
$dir_data = "$self_id"; // データ用ディレクトリ
$dir_log = "$dir_data/log"; // ログ保管用ディレクトリ
//------------------------------------------------------
// ログ受け入れ処理 BASIC認証あり
//------------------------------------------------------
  ini_set( 'display_errors', 1 ); // エラーを画面に出す。
  date_default_timezone_set('Asia/Tokyo'); $dt = date("Y-m-d H:i:s");
  $host = trim(str_replace(array("\n", "\r"), " ", uForm("host"))); // 改行は空白へ変換、前後空白削除 ホスト名
  $data = trim(str_replace(array("\n", "\r"), " ", uForm("data"))); // 改行は空白へ変換、前後空白削除 ログデータ
  $a_ip = array();
  $a_ip[] = "x.x.x.x"; // オフィス
  $a_ip[] = "x.x.x."; // データセンター
  $ip = $_SERVER["REMOTE_ADDR"];
  echo "ip=$ip<br>\n";
  $hit = 0;
  foreach ($a_ip as $ip1) {
    $len = strlen($ip1); // x.x.x.
    if (substr($ip1, 0, $len) == substr($ip, 0, $len)) {
      $hit = 1;
      break;
    }
  }
  if (0 == $hit) {
    echo "このIPは許可されていません。ip=$ip<br>\n";
    file_put_contents("$dir_data/error.log", "$dt IP-ERROR ip=$ip host=$host data=$data\n", FILE_APPEND | LOCK_EX);
    exit;
  }
  if ("" == $host) {
    echo "ホスト名が指定されていません<br>\n";
    file_put_contents("$dir_data/error.log", "$dt HOST-ERROR ip=$ip host=$host data=$data\n", FILE_APPEND | LOCK_EX);
    exit;
  }
  echo "OK<br>\n";
  file_put_contents("$dir_log/$host", "$dt\t$ip\t$host\t$data\n", FILE_APPEND | LOCK_EX); // タブ区切り
  
  exit;

// uForm フォーム変数の受取
function uForm($var) {
  if (isset($_POST[$var])) return $_POST[$var];
  if (isset($_GET[$var])) return $_GET[$var];
  return "";
}
?>

各サーバ ログ情報の送信 log_put.sh

バックアップRsyncの結果を送信します。

# vi /root/log_put.sh
data1=[cron]`crontab -l | grep rsync`
data2=[rsync]`ls -l /root/rsync.log`
data3=[sent]`tail -1 /root/rsync.log`
curl -k -s -S -X POST "https://[host]/log_put.php" \
--data-urlencode "host=`hostname`" \
--data-urlencode "data=$data1 $data2 $data3" \
-u "user:password"
:wq

# chmod +x /root/log_put.sh
# /root/log_put.sh