カテゴリー: linux

  • 手動でログローテートを行う

    手動でログローテートを行う

    はじめに

    手動でログローテートを行いたい時があるので、その対応。

    手順

    logrotate -d /etc/logrotate.d/syslog

    -vオプションを追加すると詳細が表示される 手動実行する際は-fで実行する

    logrotate -f /etc/logrotate.d/syslog

     

  • Linuxでユーザーを複数のグループに追加する方法

    Linuxでユーザーを複数のグループに追加する方法

    Datadogを使用していると、ログにアクセスできないパーミッションエラーが発生することがあります。このエラーは、Linuxで一般的なものです。解決するには、/var/log/syslogを参照できるようにする必要があります。

    以下のコマンドを使用して、/var/log/syslogにアクセスできることを確認します。

    # ls -l /var/log/syslog
    -rw-r----- 1 syslog admin 79639 Jan  2 9:09 /var/log/syslog

    DatadogのエージェントのUID/GIDを確認し、セカンダリーグループ(admin)に追加します。グループを上書きしないように注意してください。

    datadogの agentの UID/GIDを確認

    # id dd-agent
    uid=113(dd-agent) gid=118(dd-agent) groups=118(dd-agent)

    セカンダリーグループ(admin)に追加

    仮に-aを忘れてしまうと、所属しているグループを上書きしてしまいます。

    usermod -aG admin dd-agent

    確認

    # id dd-agent
    uid=113(dd-agent) gid=118(dd-agent) groups=118(dd-agent),4(admin)

    これで、Datadogからログを取得できるようになります。

     

  • Cloud Storageをコマンドで操作する

    Cloud Storageをコマンドで操作する

    はじめに

    awsであればファイル置き場にS3を使うことも多いだろう。
    s3への転送したい場合はaws s3 cpコマンドを使うことが多い。 似たようなことをGCPでCloud Storageに対して行いたいことがある。

    コマンド

    ローカルからファイルをコピーする場合 gsutilコマンドを利用する

    gsutil cp /tmp/hogehoge gs://bucket/dir/

    削除する場合は

    gsutil rm gs://bucket/dir/hogehoge

    オフィシャル情報はこちら https://cloud.google.com/storage/docs/gsutil?hl=ja

    おまけ

    ちなみにプログラム(Python)に組み込む際はこちら https://tsukada.sumito.jp/2018/11/20/gcp-python-cloud-strage-upload/

  • jsonにコメントを書く

    jsonにコメントを書く

    はじめに

    Jsonは正式にコメント欄というのがない。しかしコメント重要。なんとかする

    解決策

    “` hjson “` を導入する。

    hjsonは正式にはjsonではないが、コメントついたjson。ちゃんとしたjsonにするには、変換コマンドを通すことにより、正式なjsonへ変換が可能。

    導入

    前提条件としてnodeがインストールされていることが必須。

    npm install hjson -g

    使い方

    hjsonファイルを用意する

    [
    {
      /*
        email  (tsukada@sumito.jp)
      */
      "name": "mailAddress",
      "type": "STRING"
    },
    {
      /*
        realname (TSUKADA SUMITO)
      */
      "name": "realName",
      "type": "STRING"
    },
    {
      /*
        nickname (Smith)
      */
      "name": "nickname",
      "type": "STRING"
    },
    {
      /*
        day (2013/08/03 15:11:00)
      */
      "name": "recordDay",
      "type": "TIMESTAMP"
    },
    {
      /*
        some plans
      */
      "name": "Plan",
      "mode": "REPEATED",
      "type": "RECORD",
      "fields": [
        {
          "name": "optionID",
          "type": "INTEGER"
        },
        {
          "name": "optionName",
          "type": "STRING"
        }
      ]
    }
    ]

    hjsonコマンドでコメントが外れる

    [
      {
        "name": "mailAddress",
        "type": "STRING"
      },
      {
        "name": "realName",
        "type": "STRING"
      },
      {
        "name": "nickname",
        "type": "STRING"
      },
      {
        "name": "recordDay",
        "type": "TIMESTAMP"
      },
      {
        "name": "Plan",
        "mode": "REPEATED",
        "type": "RECORD",
        "fields": [
          {
            "name": "optionID",
            "type": "INTEGER"
          },
          {
            "name": "optionName",
            "type": "STRING"
          }
        ]
      }
    ]
    

     

    リダイレクトをしてコメントを省いたjsonフォーマットに変換することが可能

    hjson -j sample.hjson > sample.json

    参考情報

    https://co.bsnws.net/article/131

     

     

  • cronで簡易監視スクリプトを作る

    cronで簡易監視スクリプトを作る

    はじめに

    zabbixやcloudWatchのような”ちゃんとした監視”ではなく、本当にシンプルな値だけを監視して、敷地を超えた場合は通知のみしたいことがある。今回はdisk使用量のみを監視するスクリプトを作った。

    設定

    disk使用率は60%を超えた場合、通知する簡易シェル

    $ df -h
    ファイルシス   サイズ  使用  残り 使用% マウント位置
    devtmpfs         484M   56K  484M    1% /dev
    tmpfs            494M     0  494M    0% /dev/shm
    /dev/xvda1       493G  302G  191G   62% /

    通知の部分は以下の記事を流用する。

    https://tsukada.sumito.jp/2018/11/27/chatwork/

     

    sshでserverにログインし、dfコマンドでxvda1をgrep、必要なところをawkで取得し、sedで%を削除。

    その値をtestコマンドで比較し、true(閾値超え)であればchatworkへ通知する処理がこちら。

    10 12 * * 1-5 test $(/usr/bin/ssh server df | /usr/bin/grep xvda1 | /usr/bin/awk '{print $5}' | /usr/bin/sed -e 's/\%//g') -gt 60 && sh /usr/local/src/server-disk.sh

    単純にプロセスを監視して、プロセスが落ちてたら起動する処理はこちら

    * * * * * ps ax |grep -v grep | grep -q sample.sh || sh /bin/sample.sh

     

     

  • コマンドやシェルスクリプトからchatworkを投げる

    コマンドやシェルスクリプトからchatworkを投げる

    はじめに

    プログラムからchatを送信したい事がある。chatworkはAPIを公開している ( http://developer.chatwork.com/ja/endpoint_rooms.html ) ので比較的簡単に実装できる。

    ワンライナーで実施

    コマンド一発でなんとかなる

    _roomid

    _body

    _token

    は適宜設定した後、以下のcurlコマンドを実施

    curl -X POST -H "X-ChatWorkToken: ${_token} -d "body=${_body}" "https://api.chatwork.com/v2/rooms/${_roomid}/messages"

     

    シェルで実施

    簡易的な監視などを

    #!/bin/bash
    
    cat << _EOT_ > /tmp/msg.txt
    [info]
    [title] DISK is over 85%!
    [/title]
    Too dangerous, Please fix it.
    [/info]
    _EOT_
    
    _roomid=1234567890
    _body=`cat /tmp/msg.txt`
    _token=abcdefghijkl12345678
    
    curl -X POST -H "X-ChatWorkToken: ${_token} -d "body=${_body}" "https://api.chatwork.com/v2/rooms/${_roomid}/messages"
    exit 0

    _roomid、_tokenは環境にあわせ適宜入力する。

     

     

  • nginxでIPもしくはuseragentでアクセス制限をする

    nginxでIPもしくはuseragentでアクセス制限をする

    はじめに

    ここ数年、nginxを使う企業も増えて来た。今回はnginxのアクセス制御についてまとめる

    特定のIPからのアクセスを停止する

    例えばDoS攻撃。Firewallで止めるのが一般的だが、Nginxで止めたい時もある。

    その場合、拒否したいIPを先に書いて、allow allで締める。

            location / {
                # block below IPs
                deny 123.11.12.3;
                deny 10.1.2.3;
                allow all;
            }

    特定のIPから”のみ”アクセスを停止する

    allowを先に書いて、deny allで締める。

            location / {
                # block below IPs
                allow 123.11.12.3;
                allow 10.1.2.3;
                deny all;
            }

    nginxでIPもしくはuseragentでアクセス制限をする

    Nigixで複雑な制御をしたいときがある。 例えばnginxでIPもしくはuseragentでアクセス制限などだ。 set関数を使うと、if文のように管理しやすい

    サンプルコード

    nginxの設定ファイルで以下のように設定 123.12.1.1[2-9]のIPであれば許可 もしくはUseragentがFireFoxの場合はベーシック認証をかける設定

    server {
    
      set $allow_ip 0;
      if ($http_x_forwarded_for ~ ^123\.12\.1\.1[2-9]$){
        set $allow_ip 1;
      }
    
      set $fx 0;
      if ($http_user_agent ~ FireFox){
        set $fx 1;
      }
      set $conditions "${allow_ip}${fx}";
    
    
    
      location / {
        if ($conditions = 00){
          return 403;
        }
        if ($conditions = 01){
          set $auth_basic "basic auth";
        }
    
        auth_basic  $auth_basic;
        auth_basic_user_file "/etc/nginx/himitsu.htpasswd";
    }

     

  • PythonでCloud Strageへファイルをupload

    PythonでCloud Strageへファイルをupload

    はじめに

    ローカルのファイルをCloud Strageへファイルをアップロードしたい。今回はpythonを利用することにする

    手順

    インストールから利用開始まで

    実は公式ドキュメント(https://cloud.google.com/python/)が簡潔にまとまってるw

    pip install google-cloud-storage

    して

        import os
    
        import google.cloud.storage
    
        # Create a storage client.
        storage_client = google.cloud.storage.Client()
    
        # TODO (Developer): Replace this with your Cloud Storage bucket name.
        bucket_name = 'Name of a bucket, for example my-bucket'
        bucket = storage_client.get_bucket(bucket_name)
    
        # TODO (Developer): Replace this with the name of the local file to upload.
        source_file_name = 'Local file to upload, for example ./file.txt'
        blob = bucket.blob(os.path.basename(source_file_name))
    
        # Upload the local file to Cloud Storage.
        blob.upload_from_filename(source_file_name)
    
        print('File {} uploaded to {}.'.format(
            source_file_name,
            bucket))
                    

    を作り、該当箇所を適宜変更するだけでファイルのアップロードが可能。

     

  • The server time zone value ‘Asia/Tokyo’ is unrecognized or represents more than one time zone.

    The server time zone value ‘Asia/Tokyo’ is unrecognized or represents more than one time zone.

    はじめに

    embulkでmysqlへ接続しデータを抽出しようとした際、以下のようなエラーが発生し取得できなかった

    The server time zone value 'Asia/Tokyo' is unrecognized or represents more than one time zone.

    原因

    デフォルトのタイムゾーンの設定に誤りがある。1つ以上設定されてある?

    対応

    embulkのconfigのinのところに以下のオプションを追加

    options: {useLegacyDatetimeCode: false, serverTimezone: Asia/Tokyo}

    以降問題発生せず、対応完了

  • OpenVASからの攻撃をnginxで防ぐ

    OpenVASからの攻撃をnginxで防ぐ

    はじめに

    脆弱性スキャンツールから攻撃されることが度々ある。Nginxでその攻撃を防ぐ。

    どう防ぐか

    access logをみると、useragentに”OpenVAS”というのが記されていた。nginxを使っている場合、このuseragentを403 errorにさせることにした

    設定

    serverディレクティブに設定を追加する。

    もしhttp_user_agentにopenVASが含まれていたら 403 にさせる。という設定

    server {
    
        if ( $http_user_agent ~* (OpenVAS) ) {
            return 403;
        }
    

    この設定を入れた後nginxを再起動させるのみ

    もちろんuseragentを偽装されてしまえばこの対応では防げないが、デフォルトのuseragentから来ることが多いので、大半のアタックは防ぐことができる。