maetesのブログ

個人用Memoです

JAWS-UG横浜 #12 AWS Serverless参加メモ

https://jawsug-yokohama.connpass.com/event/77114/

19:10 - 19:40 AWSによるサーバーレスアーキテクチャ 吉田 真吾

  • serverlessconf をやります!
    • 9月の末ぐらいにやる予定
  • AWSサーバレスアーキテクチャ(本)

  • PaaSの普及

    • 移植性
    • 保守メンテナンス
    • スケーラビリティ
    • 設計の独自の自由のなさ
  • Dockerによるコンテナ技術の一般化
    • 結局めんどくさいよね
    • Kubernetes クバネテスでどうやって管理するべきか。どっちがベストプラクティスなのか
    • PaaSがこようがContenair がこようが面倒なのは面倒なんだ
  • Function computing は本当に便利
  • よい制約がよい実装を実現する
  • リアクティブなアーキテクチャを実現するための要素
    • リクエストルーティング機能
  • Well-architected Framework の別冊でSeverless Application Lens
  • Gartner の資料 Gartner identification Will Drive Digital business into the nextdecade

  • Alexa

  • Function のサービスとOSS実装
    • lablda local
  • やっぱり内製しないとだめですか?
    • アーキテクトと実装の分割さえできればむしろ行程や品質管理しやすい
  • Zipkin
  • iopipe
    • lambda をラップしてグローバル変数や起動ステートといったメトリクスを収集して性能改善に必要な情報を得られるSaaS
    • 最近のTrend はCloudwatch logs にはきださせて非同期系のツールに変わりつつある 例)Epsagon ThunDRA

19:40 - 20:10 サーバーレスSPAのフロントエンド 西谷 圭介

  • API Gateway
    • Common Log FormatやJSON,csvでのログ出力が可能
  • Single page Application : SPA
  • React
    • JSX - XML風の言語でJavascriptのコード内にHTMLタグを埋め込むように記述
  • Angular
  • Vue.js

  • フレームワークそのものは上記3種類で落ち着きつつある

    • 派生物としてReact Native やIonicなどもある
    • React優勢
    • 話題の中心はステート管理に向かいつつある
      • Redux
      • MobX
      • NgRx
      • vuex
  • Progressive Web Application : PWA
    • Webapplication だがPush 通知ができるとか
    • 主要フレームワーク向けのライブラリはすでに存在する
  • AWS Appcync
    • フルマネージドなGrapQLサービス
    • リアルタイム機能とオフライン機能
    • GraphQLとは
      • API用のクエリ言語
        • 型システムにもとづいたクエリ実行のためのサーバ側ランタイム
      • クライアントがサーバからデータを取得、変更、購読できるようにするためのデータ言語
      • Rest の次を期待されるもの。Facebook が作成
  • GraphQL Subscription
    • ほぼリアルタイムでデータをサブスクライブ
    • Mutation をトリガーにしたイベントベースモード

20:10 - 20:25 サーバーレスでシステム自動化 新居田 晃史

  • AWS Systems Manager
    • Amazon Linux ならSSMエージェントが入っている
    • Run command が大変便利
      • ssh  なしでコマンドが実行可能
      • リモートからのファイルダウンロード
      • Ansible のPlaybookが実行可能
  • EC2 → Zabbix → SNS → Lambda → SES / Twillio / EC2 System Manager →Runcommand
  • Zabbix をリプレイスしても動くように疎結合になるように設計
  • cron の代用
    • Cloudwatch Events → Lambda → Ec2 System Manager
  • Elasticsearch へのログ配送方法
    • fluetnd → kinesis stream → aws lambda → elasticsearch      → Kinesis Firehose Amazon S3
    • fluentd がElasticsearch に投げきれなくてFluentd のプロセスが落ちたと言うことがあった
      • 仮にすごく増えたとしても、上記の構成ならLambda の部分で失敗になり、かつその間にElasticsearchh のインスタンスを増やせばよいという判断でこんな設定を考えている

20:25 - 20:40 サーバレスアプリの監視で苦労したこと的なお話 石田 浩司@Acroquest Technologies

→ ぼんやりとしたサーバレスアプリの監視を本格的に行おうとした話

  • サーバレスでアプリを構築したとき監視ってどうしてます?
  • Cloudwatch だとかゆいところに手が届かない。。。
  • Cloudwatch logs subscription は正規表現で加工とするとログsy津留よくごとに通知を処理する必要がある
  • → Lambda 書くか。。。 という結論
  • 定期実行であればS3 に対して取得してからそりをするとか
    • prefix ごとに親Lambda が子Lambda をたくさん作って、処理をする github.com/acroquest/aws-cloud...
  • 詳細はWebで 「AWS Cloudwatch のログキーワード監視ツールを作ってみた。」

20:40 - 20:45 優しくサーバーレスに引きずり込むための個人的考察 大竹 孝昌

  • Solacom technology Event 4/21?
  • リスクあるんじゃないのか!クラウドなんて信用できない!
  • 心理的安全性の演出
    • Lambda だけでいいよ。担当を限定する
    • あの本を買い与える「実践 AWS Lambda」:この本だけ読めば大丈夫!

20:45 - 20:50 IAMアカウントロックをServerlessで作る 森谷 優貴@NTT Docomo

  • iam:UpdateUser
    • IAM ユーザ名を変更するAPI。あまり知られていない
    • Console ではない機能
  • status はDynamodb で管理
    • 読んだら読んだだけお金がかかってしまうので、コスト削減のため失敗回数のみ管理
  • ログインイベントをCloudwatch Event でHook してLambda起動
    • Lambda はDynamoDB をチェックして失敗回数がNになったらUpdateUseしてアカウントをロックするとともにCloudwatch Event をスケジュール
  • Cloudwatch Event が定期的にLambdaを起動

20:50 - 20:55 業務系アプリケーションでサーバーレスやってみた 杉本 慎也@JBCC

20:55 - 21:00 Step Functionsのすすめ 西尾 智弘@PAYJP

Zabbix 2.4 でログデータからint情報の登録

Zabbix 2.4 の環境で、ログデータから情報を登録する必要があったのでそのご紹介です

問題点

  • Zabbix 2.4 環境ではログデータはstring型のみであり、数値情報として扱えない
    • つまりZabbix Agent のログ処理系の関数は使えない
  • Agent側のUserParameter で定義した場合、監視間隔で実行され、実際にログが出力されたタイムスタンプで登録ができない

解決策

詳細

  1. 10分ごとのcron でログデータを確認
  2. 合致した場合ログデータを整形して別ファイルとして出力しておく
  3. Zabbix sender で当該ファイルを読み込んで出力

source code

今回はPythonで書きました

import re
import datetime
import time
import glob
import subprocess
import sys
import os

# Run every 10 min
# 08:00run --> 07:50 data check
# logExample)
#   INFO   | jvm 1    | 2017/11/14 15:00:00 |  16000000K->10000000K(40900000K), 10.0000 secs]


def main():
    # time variables
    now = datetime.datetime.now()
    base_time = (now - datetime.timedelta(minutes=10)).strftime("%Y/%m/%d %H:%M")[:-1]
    time_key = base_time[-1]

    # define variables
    inputfile = glob.glob('/tmp/testdata/server.log')
    output_filename = "/tmp/zabbix_senddata_output_" + time_key + ".txt"
    zabbix_server = "192.168.10.58"

    pattern = '\| (\d{4})/(\d{2})/(\d{2})\s(\d{2}):(\d{2}):(\d{2}).+\d+K->(\d+)K\(\d+K\)'
    msg = ""

    # getting information
    for file in inputfile:
        rfile = open(file, 'r')
        for line in rfile:
            r = re.search(pattern, line)
            if r:
                date = datetime.datetime(int(r.group(1)), int(r.group(2)), int(r.group(3)), int(r.group(4)),
                                         int(r.group(5)), int(r.group(6)))
                msg = msg + os.uname()[1] + " w_memory " + str(int(time.mktime(date.timetuple()))) \
                    + " " + r.group(7) + "\n"
        rfile.close()
    if msg == "":
        sys.exit()
    else:
        with open(output_filename, 'w')as wfile:
            wfile.write(msg)

    # sending info to zabbix
    command = ["/usr/bin/zabbix_sender", "-z", zabbix_server, "-p", "10051", "-T", "-i", output_filename]
    res = subprocess.Popen(command, stdout=subprocess.PIPE).communicate()[0]
    subprocess.call(['/usr/bin/logger', __file__, res])


if __name__ == '__main__':
    main()

なお、環境が古くPython2.6系しかなかったので、subprocess コマンドは少し古めで書いてあります。。。

confluence API を試してみた

概要

Confluence API があるということでPython で書いてみました。
背景としては毎週議事録をConfluence に記載するのですが、その枠を過去分からコピーして作成しなくてはならず、まぁちょっとした作業ではあるのですが、毎週勝手に生成されればいいのに、、、と思ったのがきっかけです。

コード処理概要

  1. 特定のparent_id 配下で数字4文字のあるtitle をtitles に格納
  2. sortして一番新しいpage_title を保存
  3. そのPage title をキーにしてcontents をAPIでとってきて新規ページとして作成
  4. なお新しいページタイトルは実行日から三日後とする

本当はhipchat連携もしており、そこらへん無理に省いたのでうまく動かないかもです。

# -*- coding: utf-8 -*-
import requests
import json
import re
import datetime

BASE_URL="http://confluence.testurl.com/rest/api"

with open('credential','r') as file:
    Auth = tuple(file.read().strip().split(','))
HEADERS = {"content-type":"application/json"}
SPACE_KEY="testspace"

def main():
    copy_page("16505174","議事録")

def get_most_new_title(parent_id):
    response = requests.get(
        BASE_URL + "/search?cql=parent=" + parent_id,
        auth=Auth,
    )
    response.raise_for_status()
    json_search_contents = json.loads(response.content.decode('utf-8'))
    titles = []
    i = 0
    for tmp in range(0, len(json_search_contents['results'])):
        data = json_search_contents['results'][i]['content']['title']
        if (re.search('\d{4}', data)):  # page title should include 201[89] as timestamp
            titles.append(data)
        i = i + 1
    return sorted(titles)[-1]

def copy_page(parent_id,new_page_title):
    old_page_title = get_most_new_title(parent_id)

    # Get Old Page Content
    response_get = requests.get(
        BASE_URL+"/content",
        auth = Auth,
        params={
            "title":old_page_title,
            "spacekey":SPACE_KEY,
            "expand":"body.storage.value"
        }
    )
    response_get.raise_for_status()
    json_contents  = json.loads(response_get.content.decode('utf-8'))
    old_page_content = json_contents['results'][0]['body']['storage']['value']
    # print(old_page_content)

    # Create new page
    new_date = datetime.datetime.now()+datetime.timedelta(days=3) # New pages timestamp should be now + 3days
    new_page_title=new_date.strftime('%Y-%m-%d')+" "+new_page_title
    payload = {
        "type": "page",
        "title": new_page_title,
        "ancestors": [{"id": parent_id}],
        "space": {"key": SPACE_KEY},
        "body": {
            "storage": {
                "value": old_page_content,
                "representation": "storage"
            }
        }
    }

    response_create = requests.post(
        BASE_URL+"/content",
        auth=Auth,
        data=json.dumps(payload),
        headers=HEADERS
    )
    response_create.raise_for_status()
    json_create_contents = json.loads(response_create.content.decode('utf-8'))
    # print(json_create_contents)
    create_id=json_create_contents['id']

    return create_id

if __name__ == '__main__':
    main()

所感

どうしてもコードが汚く感じる。。。 もう少しきれいにコードがかけるようになりたい。

AWS re:Invent 2017 Recap@JAUS-UG 横浜支部

概要

AWS re:Invent 2017 Recap@JAUS-UG 横浜支部に参加してきました。
https://jawsug-yokohama.connpass.com/event/62997/

自動運転で、自動運転カーの話 吉田真吾

  • Lambda Go 言語サポート
  • .NET の2.0
  • Lambda 1.5Gガ最大だったが3GBに変わった
    • 1.8GB を境にしてシングルコアからマルチコアに切り替わるらしい
    • application として対応できるようにしないと、1coreで張り付いちゃうかもしれない
  • console update
    • Cloud9と統合
  • aws serverless repository
    • あまり自由にやれそうな話しが明言されていなかった。
    • 公式アプリと野良アプリで使い分けると
  • Blackbelt で資料が出てきるのでそれをみるとよい
  • AWS Cloud9
    • すでにあるSaaS版は残っている
    • Lambda との統合が非常に簡単
    • lambda の開発環境としてかなりよい。

      ROBOCAR RALLY 2017

  • THE ARIA で開催
  • Donkey Car
    • 市販製のラジコン
    • 3Dプリントしたカメラマウント
    • Rasperry PI 3 + カメラモジュール
    • Tensorflow + keras
    • 20週程度の学習データ
      • くそデータがでたらすぐにやめてはやりなおすを繰り返した
  • ラズパイのセットアップ
  • G2 インスタンスセットアップ

Everything about AWS re:Invent 2017 亀田治伸

AWS プロダクトマーケティング

  • 全部で6会場。端から端まで歩くと1時間半ぐらいかかる
  • Gartner が出している数字を使っていた。いつもOracle のデータ使ってたのに(笑
    • 他の会社と比べても44.1% である。ちょっと意外だったのはアリババが結構伸びている
  • T2 Unlimited
    • バーストを超えて高性能を発揮
  • H1 インスタンス
  • Auroral serverless
    • First touch ペナルティ
    • テスト環境あAurora serverless になりそう。
    • まだプレビュー
  • Amazon Nepture
    • グラフデータベース
  • S3 select

    • 特定のコンテンツをSelect可能
    • データがたまればたまるほど検索に時間がかかっていたが、特定オブジェクトを選択してバイナリとして使うことができる
  • Amazon SageMaker

    • スケール可能な機械学習モデル簡単に、構築、学習、デプロイ可能に
    • 必ずしも学習は東京にしなくてもよい。その方がより安く使えるのではないかと考える
  • リージョンをまたいだVPC Peering
    • 非常に要望が多いので東京はまだないか、いつかできるだろう
  • AWS WAF マネージルール
    • いろいろな設定済みの環境をAWS Marketplaceで提供
    • 各ルールをベンダが作ってくれたものがある

数字でみるre:Invent2017分析

https://www.slideshare.net/tossi104/20171204-jawsug-reinvent2017

reinvent 2017 でのサービス発表で企業に何が起こるか 森谷優貴@NTTdocomo

  • time sync よい。
  • docomoさん社内はSplunk でやっている
  • organization billing からFull control は結構大変

F-secure 河野さん

http://bit.ly/awsreinvent2017wrapup

  • JAUS-NW に会場提供してかなり盛り上がった

アスキーのいびざさん

  • 「クラメソさんに勝とうとしないw」
  • メディアとしてどういう立ち居地で取材するか
  • プレスはぜんぜん別の枠組みがあってそこで飲み会とかあったりする
  • 最後の二日はベッドで寝ていない。取材→懇親会→執筆という流れ

mamari 永井さん

https://speakerdeck.com/shoichiron/le-nishi-etebian-li-tanatosi-tutaawsfalseji-neng-3xuan

所感

横浜は近いので行きやすい。会場の雰囲気もよく楽しい時間をすごせた。
何回か規模(人数・会場)に触れている方がいたが、このまま参加者が単調増加していくともう今の会場やラスベガスでは開催できないだろうと思われる。
今後どうしていくのか気になるところ。
来年こそ参加したい。

生産性を高めるためにやっていること

背景

昨今生産性がよく話題になる世の中であるので、自分が取り組んでいる点について記載してみる

社会人としては当たり前ですね。という内容な気もしますが、できていない部署もある認識なので自戒もこめて記載。

会議関連

  • 議事録は検索ができる基盤へ必ず入れておくこと
  • 議事テンプレートは勝手に作られる(自動化)
  • 打ち合わせは決定事項あり気で行う。
  • 会議体を多く持たない。席が近いところで解決できることは解決

タスク

  • タスクはクオータごと、個人では月、週ごとにタスクを見える化する
  • 週時で自分の作業を見直し実績を見える化する
  • 費用対効果の低いタスクはやらないという判断を積極的にする
  • 円滑な引き継ぎのために忙しくても障害事例は必ず記録する
  • 残業しないでできるタスクを仕事量として認識する。自己研鑽は基本的には業務時間内でやらない。

コミュニケーション

  • 複雑なことを説明するときは絵とか表を使って説明する
  • 口頭、チャット、メールの特性を理解し、最適な手段を使う

自動化

  • ツール化を積極的に進める
  • ツール化できる能力を積極的に養う

2017/11/30 ITMedia エンタープライズセキュリティセミナー

概要

ITMedia エンタープライズセキュリティセミナーに行ってきました。
今回はそのレポートです。
https://itmedia.smartseminar.jp/public/application/add/1542

所感

全体的にキーワードとしてはエンドポイント、threat hunting のように見受けられました。
piyokangoさんに会ってみたくて参加し、実際に話を聞けて良かったです。セキュリティリサーチャーズナイトはpodcast「セキュリティのアレ」そのままでpodcast を聞いている気分になりました(笑

以降メモです

流行に惑わされない!正しい次世代エンドポイントソリューションの選び方

ジャパンネット銀行流CSIRT運営 ~CSIRT運営から見えた効果的なサイバー攻撃対策~

  • 株式会社ジャパンネット銀行 IT統括部サイバーセキュリティ対策室長 JNB-CSIRT 岩本 俊二 氏
  • 金融ISAC

  • お客様全員にトークンを無料配布

    • RSAから、薄いカード型に変更
  • 更新系API連携もリリースしている
  • 社員数300人ぐらい。
  • JNB-CSIRT 立ち上げ。2012年から
    • 経営会議に3回付議も・・・
    • 他社CSIRT(富士通さん)による当社CSIRT機能の評価を実施
  • 課題
    • インシデント分析→Splunk導入
  • CSIRTの中にSOCを含めている
    • 300人ぐらいの人材だと別部隊でおけないので、Best effortでSOCもやっている
  • Mission を定めている
    • ミッションは書くメンバーの活動全てに優先される→開発部門の人も、忙しくてもミッションを達成することが優先される
  • 個人のノウハウに依存しないための決めごと
  • 情報共有範囲(TLP Traffic Light Protocol 定義
    • 脆弱性対応基準。緊急度が高い場合にはCSIRT側から対応を勧告。5つの判断軸を作っていて、4つ合致したら必ずやるというルール
  • 活動概要
    • セキュリティ意識向上のための啓蒙活動
    • インシデントハンドリングに関する規定整備
    • 標的型メール訓練
      • 我々からすれば開封率をあけることを目標としている。いかに開かせるか。それでやばいと思って初動対応を覚えるんです
      • 巧妙なメール開封は完璧に防御するのは不可能。確率の問題。不審通信を通知、初動対応の徹底が鍵。
      • 役員にまず開かせるのが重要(笑
    • 共同演習への参加
    • セキュリティ人材育成
  • ログ分析(共助:信頼関係の醸成による有力なIndicator情報の早期入手

  • セキュリティ製品を使い倒す

    • 新製品導入前に、既存製品での対応可否を確認する

ログ分析こんな風にしてます

  • 何を目的に分析するか
  • ログの概要把握
  • 取得ログの選定

  • 徐々に取得ログを増やしていったところいつの間にか社内SOCが誕生

    • セキュリティ以外のところも活用し始めた
  • レポートを毎日見る
    • 毎日みていると異常に気づきやすくなる。1日30分ぐらい
  • レポート、アラートを日々改善する
    • ゴミアラートは排除
    • 様々な観点の分析を検討
  • 精度・鮮度の高いIndicator とぶつけること
  • 他社で不正利用されたIP.UA等が、自社でも使われていないかを早期に知ることで被害抑止につながる

DDos 攻撃を受けた

  • サイトダウンを経験
  • 2006 SYN Flood . 1200IPアドレス。2~5万パケット/s
  • 2011 TCP connection Flood 1IP, 1000connection/m
    • ISP に聞いたが回線レベルだと全然問題なかった。1IP だし。
  • 2014 Akamai への切り替え。ISPのサービス追加導入
  • 2015 ヴォッシング(ボイスフィッシング)
    • 500件試行されて成功率80% 。騙る入電は数十件
    • ログインが成功して、お金がたくさんもってくるとわかると電話がかかってくる?

サイバー攻撃対策の最新トレンドと「脅威ハンティング」

  • 脅威ハンティングとは
    • 欧米では緩い意味で結構使われていて、SOCやCSIRTでやられるようなことも含まれている

      サイバー攻撃者を積極的に監視し、追跡し、サイバー切るチェーンにおいてできるだけ早く排除する行為
      Samuel Alonso Blog, Jan. 21, 2016

  • 脅威ハンティングがなぜ今注目されるのか
    • 攻撃の進化と、過検知(どうしても攻撃が進化すると発生する)
  • PETYA
  • エンドポイント対策
  • InfoTrace Mark II for Cyber

所感

スライド内容以外にも過去事例やこれまでの経緯や最近の事例を随所に含めて説明があったため、説明に納得性があるとともに、講演者のセキュリティに関する能力の高さがうかがい知れた

高度なサイバー攻撃への対処 ~ インテリジェンスを活用したインシデントレスポンス ~

www.reuters.com →講演ではこれではなかったが、こういった記事から始まる。むしろこの講演で初めて知った。

  • Kaspersky 製品が米国からbun される・・・記事で弊社をしった方はどれぐらいいますか?
    • 安心してご利用いただけます。
      • 経営の透明性への取り組みを強化するため、Global Transparency Initiative を開始しました
      • NSA の秘密情報をロシア政府が化スペルスk-製品を利用して入手したとされる事案に関する内部
  • We are heare to Save the World from IT threats.

  • Lazarus Group ~ 北の関与が疑われる巨大集団

  • BlueNoroff ~ Lazarus グループの金融犯罪部門
  • ATMitch ~ 見えない攻撃でATMを遠隔操作
  • ShadowPad ~ サーバ管理ツールからのサプライチェーン攻撃
  • 攻撃の傾向と、企業の被害調査結果、インシデント対応能力、外部人材への依存

  • インシデントレスポンスフレームワーク

    • 人材・スキル / テクノロジー / プロセス

セキュリティ人材に必要な「サイバーと現実」を意識したスキルを資格で視える化する

  • CompTIA日本支局

  • SIer A社スキル取得推進表

    • 福利厚生で日本は資格は使われがち
    • 会社のゴールとは別な形で資格取得が進められる可能性がある
      → 資格それぞれには役割があるのでそれを理解することが必要
    • 論理的 →具体的の軸。専門的→汎用的の軸でかくと、CompTIAは具体的+汎用的
    • 基本情報→Comptia → ベンダ資格→ 国家資格スペシャリスト
  • キャリアパスアセスメント

    • 期待通り+非常に近いは Japan は19%。5カ国の中で最低レベル
    • 個々人で能動的に考えることがない
  • 企業がゴールを考えて、必要な能力に紐付ける形でキャリアパスを描いてあげればよいのではないか。

  • 株式会社アシックス

    • 海外売上比率がもう7割以上。
    • 海外支社が40社以上
  • 2017年から情報セキュリティ強化対策を進めた
    • セキュリティ運用・セキュリティガバナンス・セキュリティテスト
  • 国内外地域をカバーしつつ迅速にする組織
  • セキュリティエンジニアに必要なスキルとは
    • セキュリティ技術・管理(ISMC,GDRPとか)、企画・法令
    • グローバルセキュリティ資格制度
      • CISSP,SSCP SANSmISACA CompTIA
    • 知識以外ンスキル
      • コミュニケーションスキル、国際社会やビジネスの話
  • SecureWokrs →アセス。パートナー
  • TANIUM の導入
  • SIEM はSplunk

セキュリティリサーチャーズナイト

  • piyokango 氏

    • まとめているけど今年20件ぐらいしかかいてない。去年と比較すると半分ぐらいだ。
    • 総務大臣からハンドルネームで表彰される
  • 辻さんのBigイベント

    • 今年の夏事件事故がありました。ソフトバンクテクノロジー
    • 不正アクセス
      • 検証用のサーバ。お客さんのデータ移行とかの検証。そこに使っていないアカウントがあった。消し忘れのようなアカウンと。パスワード脆弱。アクセス元も制約がなかった。テストデータではなくて実データを保存していた。
      • 最終的には第三者機関に調査をしてもらって、幸い情報は漏れていなそう。となった
      • 検証用サーバからOfficeのPCにマルウェア展開されて、仮想ツールマイニングがされていた
      • どういった体制で望んだのか?
        • システム担当、顧客担当(営業)、広報担当、第三者機関窓口担当
    • 辻さんは経営層とその他との間でまるっと担当
    • 土日がなくなる感じではあった
  • インシデントが起きてその後の実際の対応
    • サイバーセキュリティ経営ガイドライン、付録C
      • インシデントが起きたときにどのような対応が必要なのか、細かく書いてある資料
      • どんな情報を整理・集めればいいか?とか。を整理している。事前にみて、システムを考えたときに埋めることができるのか?も考えてほしい
  • 影響範囲とかを把握するのがすごく大変だった

    • 他に同じような攻撃を受けていないか?といったところ
    • 管理されているシートは本当に最新か?とか。クラウドの場合は画面みるとか。一応管理はしていてもやっぱり裏取りはしないといけない
    • ちゃんとやられているかの裏取りを各担当に一斉に連絡してやるしかなかった
      • アクセス制限されていないようなものがあった
      • IIJ でもあった。IPスキャンすると出てくる。聞いてみるとどこどこで検証して~とか
      • うちでも管理はしているが、どうしても漏れるということがある
      • やはりそういう状況があるとセキュリティ侵害が発生するリスクをはらんでいると思う
    • 誰が管理しているのか?がすぐわかったのは良かったのでは
  • 手元に怪しげなファイルが見つけたとき、どのように対応したのか?

    • Mining となぜわかったのか→通信を見て判断
    • 仮想Mining toolだけなのかもう一度再チェックをしている。
      • 監視とかやっている解析部隊がチェックをした。
    • たいていの会社ならEndpoint で検索するのかなぁ。そして外に依頼するんだろうね

      • 今回のCaseはEndpoint にソフトあったが検証環境ということで古いものがあって見つからないところがあった
    • 影響範囲をきちんと特定するためにはマルウェアが何でどういう挙動なのか調べないといけないよね。

      • Forensic をやっている機関に任せるしかないのではないか
  • なぜ第三者機関といっているのか?セキュリティ会社だよね?
    • Forensic 調査会社でよいんじゃないの?
    • 自分たちで調べました という形ではしないようにしている
    • 名前は出せないもの?
      • 出さない方が統制上いいだろうという話
      • 取材が第三者機関の名前を出してしまうとそっちにいってしまうと困る
      • 窓口を一カ所にまとめるほうがよい

情報公開の話

  • 不正アクセス概要の絵がなかった。

    • よく読んでもわかりにくかった。
    • 絵を使った報告であればわかりやすいんだが、他でもあまり図が入ったようなレポートがない
    • 次からで(笑)
      • 本当に時間がぎりぎりなので、報告でわかりやすさを細かく入れるのは難しい。入れようという発想はなかった
    • 事件事故がおきると、よく報道では絵を起こされる。当事者から見るとちょっと違うな、という事がある。
    • 絵は一人歩きする事がある。最終報告のときに入っていればよかったんじゃないかなぁ。
    • 今回の絵は取材を受けるときに広報と一緒に作った
  • 調べた内容で何を出す出さないという事を決めたのか?

    • 基本的に出さないと言うことはなかった。
      • 出さない方がいいんじゃないか?みたいな意見はなかった?
        • 辻さんが外に色々講演とかしている。講演とかするときに話がしにくいような状況は避けろというのがTOPの判断
  • 情報の漏洩が0 ではない。
    • 検証環境にもし顧客情報がなかったら?公開していなかった?
    • 辻さんとしては出して、って言うかな。こういう攻撃があるっていうのは世の中にはしってほしい。
      • File 名とかFile hash とか。今回出している。そういった情報を共有したい
  • 情報の漏洩が確実だったら、あまりこういう場では喋れないのでは?
    • あまりそれは関係ない。漏洩したことは謝る必要はあるが
    • 漏れていた、漏れていない関係なくリリースは出すんだ!という判断があった
    • 漏れたのを確定してから出すのは遅い。
    • 場合によっては影響を確定してから出したい、というのは会社によってはあるよね
      • もし本当に影響がなければ知らせる必要ないかもしれないしね。
  • 攻撃に関わる情報をつまびらかにすると攻撃者にメリットがあるので内容によっては伏せるという話しがある
    • あまり伏せたいという考えはなかった。どちらかというと公開したほうがいいと考えた
    • 共有して、経営層がうちは大丈夫か!?というところで調査がされた方が攻撃者よりも同業者にメリットがあると考える
    • 大多数の攻撃は広く知られている攻撃手法のことが多いので、

ElasticsearchとArcsightModule を試してみた

概要

先日Arcsight ModuleがElsaticsearch から出たということで、取り込めるかどうか試してみた。

環境

Centos7 @AWS環境 & proxy環境
Elasticsearch 6.0

elasticsearch のInstall

yum remove -y java-1.7.0-openjdk
yum install -y java-1.8.0-openjdk-devel
yum install -y java-1.8.0-openjdk-debuginfo --enablerepo=*debug*
# java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
cat << EOF >  /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
sudo yum -y install elasticsearch
systemctl status elasticsearch
systemctl enable elasticsearch
systemctl start elasticsearch
# curl localhost:9200
{
  "name" : "QaYIMOJ",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "b2cZBZkYQ-up7dPS_LTZ1g",
  "version" : {
    "number" : "6.0.0",
    "build_hash" : "8f0685b",
    "build_date" : "2017-11-10T18:41:22.859Z",
    "build_snapshot" : false,
    "lucene_version" : "7.0.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

kibana のInstall

www.elastic.co

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
cat << EOF > /etc/yum.repos.d/kibana.repo
[kibana-6.x]
name=Kibana repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
yum -y install kibana
  • 設定変更(logging とアクセス制限)
# diff -u kibana.yml /etc/kibana/kibana.yml
--- kibana.yml  2017-11-11 03:50:42.000000000 +0900
+++ /etc/kibana/kibana.yml      2017-11-22 16:55:49.833624169 +0900
@@ -4,7 +4,7 @@
 # Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
 # The default is 'localhost', which usually means remote machines will not be able to connect.
 # To allow connections from remote users, set this parameter to a non-loopback address.
-#server.host: "localhost"
+server.host: "0.0.0.0"

 # Enables you to specify a path to mount Kibana at if you are running behind a proxy. This only affects
 # the URLs generated by Kibana, your proxy is expected to remove the basePath value before forwarding requests
@@ -18,7 +18,7 @@
 #server.name: "your-hostname"

 # The URL of the Elasticsearch instance to use for all your queries.
-#elasticsearch.url: "http://localhost:9200"
+elasticsearch.url: "http://localhost:9200"

 # When this setting's value is true Kibana uses the hostname specified in the server.host
 # setting. When the value of this setting is false, Kibana uses the hostname of the host
@@ -83,7 +83,7 @@
 #pid.file: /var/run/kibana.pid

 # Enables you specify a file where Kibana stores log output.
-#logging.dest: stdout
+logging.dest: /var/log/kibana.log

 # Set the value of this setting to true to suppress all logging output.
 #logging.silent: false
# systemctl restart kibana

ブラウザで起動:
http://172.20.214.47:5601

logstash のインストール

https://www.elastic.co/guide/en/logstash/current/installing-logstash.html

cat << EOF > /etc/yum.repos.d/logstash.repo
[logstash-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

yum -y install logstash

Logstash でとりあえずログを入れてみる

/etc/logstash/conf.d/messages.conf

input {
  file {
    path           => "/var/log/messages"
    start_position => beginning
  }
}

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}


output {
  elasticsearch {
    hosts  => "localhost"
    user   => "elastic"
    password   => "changeme"
    index => "logstash-2017-11-22"
  }
}
  • Permission がない場合は与える。問題があれば/var/log/logstash/logstash-plain.log を確認

Arcsight Module のインストール

https://www.elastic.co/guide/en/logstash/current/arcsight-module.html

ES_JAVA_OPTS="-Dhttp.proxyHost=proxyurl.com -Dhttp.proxyPort=3128 -Dhttps.proxyHost=proxyurl.com -Dhttps.proxyPort=3128" /usr/share/elasticsearch/bin/elasticsearch-plugin install x-pack

wget https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.0.0.zip
/usr/share/kibana/bin/kibana-plugin install file:x-pack-6.0.0.zip


ES_JAVA_OPTS="-Dhttp.proxyHost=proxyurl.com -Dhttp.proxyPort=3128 -Dhttps.proxyHost=proxyurl.com -Dhttps.proxyPort=3128" /usr/share/logstash/bin/logstash-plugin install x-pack

パスワードの設定

/usr/share/elasticsearch/bin/x-pack/setup-passwords interactive
...
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [elastic]

有効になっているか念のため確認

curl -u elastic:changeme localhost:9200

kibana.yml で下記設定をする

elasticsearch.username: "elastic"
elasticsearch.password: "changeme"

起動

  • 下記をlogstash のConfig に追加
modules:
- name: arcsight
  var.inputs: "smartconnector"
  var.input.smartconnector.port: "5000"
  var.elasticsearch.hosts: "localhost:9200"
  var.elasticsearch.username: "elastic"
  var.elasticsearch.password: "changeme"
  var.kibana.host: "localhost:5601"
  var.kibana.username: "elastic"
  var.kibana.password: "changeme"
  • logstash の起動

Arcsight Connector 側の設定

  • CEF Syslog
  • Elasticsearch のIP
  • Port=5000
  • Protocol=Raw TCP
  • Forwarder=false
  • CEF Version=0.1

所感

Elasticsearch にArcsightからのログを配送できるということで試してみた。 ArcsightConnector 側で構造化されているので、これで取り込めると検索基盤として色々便利そう。