【脅威インテリジェンス】第二回 OpenCTIのインストール(I)

こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面 和毅です。

ジャンルを今迄よりも広げて、脅威インテリジェンス情報をお届けすることを考えています。

前回まででMISPをインストールしました。今回は、OpenCTIのインストールを取り上げてみます。まずはOpenCTIが立ち上がるところまでをこの記事の区切りにしています。

環境

  • プラットフォーム:VM(TIME4VPSを使用)。
    • OS: Ubuntu 20.04 (64-bit)
    • Processor: 2 x 2.6 GHz
    • Memory: 16384 MB (つまり16GB!)
    • Storage: 80 GB
    • Bandwidth: 1000 Mbps (Monthly limit: 16 TB)
    • 1 Gbps port speed ( 12.00 EUR )
    TIME4VPSは激安なので、上記のスペックで年間「192EUR = 25,000円程度」になります。使用感としては、スペックは問題ないですし安定しています。ただ、MISPの時に感じたのと同じく、日本からだとネットワークが遅いので、上述の1Gbps port (12.00 EUR)をつけたほうが絶対良いです。

インストール

OpenCTIのインストールですが、Dockerを使いDockerの管理としてPortainerを使用しています。基本的なインストール方法は、こちらを参考にしました。また、特に記載がない場合には(プロンプトが$になっている場合には)実行ユーザは一般ユーザ権限で行っています。

また、基本的にインストールはansibleを用いて行っています。一部、ansibleのファイルも公開しようと思います。

  1. OS(Ubuntu 20.04)をインストールします。時刻合わせ、ファイアウォールの設定、自動更新の設定を行います。下記のようなymlになっています。
    
    - hosts: all
      become: yes
    
      tasks:
        - name: install ntpdate module
          apt:
            name: 
              - ntpdate
    
        - name: cron job for ntpdate
          cron:
            name: sync clock
            minute: "5" 
            job: /sbin/ntpdate -b ntp.nict.jp >%gt; /var/log/ntpdate.log 2>&1
            user: root
    
        - name: update os with crond 
          cron:
            name: apt update 
            minute: "10" 
            job: /usr/local/sbin/aptupdate.sh >> /var/log/update.log 
            user: root
    
        - name: update system
          apt: update_cache=yes
          tags: system
    
        - name: upgrade system
          apt: upgrade=dist
          tags: system
    
        - name: Check if a reboot is required
          register: file
          stat: path=/var/run/reboot-required get_md5=no
    
        - name: Reboot system
          command: /sbin/reboot
          when: file.stat.exists == true
    
  2. Docker-ceから新しいDockerを持ってきてインストールします。aptを用いる場合には、直接DockerとDocker Composeを入れて下さい。anibleで使用したymlは以下になります。
    
    - hosts: all
      become: yes
      vars:
        docker_users:
          - sios
    
      tasks:
        - name: Add Docker GPG apt key
          apt_key:
            url: https://download.docker.com/linux/ubuntu/gpg
            state: present
    
        - name: Add Docker Repository
          apt_repository:
            repo: deb https://download.docker.com/linux/ubuntu focal stable
            state: present
        - name: Update and install docker-ce
          apt: update_cache=yes name=docker-ce state=latest
        - name: Update and install docker-ce-cli
          apt: update_cache=yes name=docker-ce-cli state=latest
        - name: Update and install docker-compose
          apt: update_cache=yes name=docker-compose state=latest
    
        - name: Add to docker group
          user:
            name: "{{ item }}"
            groups: docker
            append: yes
          with_items: "{{ docker_users }}"
    
    
  3. 以降はコマンドで行います。Docker swarmをインストールします。こちらは必要ないようですが、念の為に入れておく程度です。
    
    $ docker swarm init --advertise-addr <MANAGER-IP>
    Swarm initialized: current node (XXXXXXXXXXXXXXXXXXXXXX) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token YYYYYYYYYYYYYYYYYYYYYYYYYY MANAGER-IP:PORT
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    
    と出てくるので、下記のようにTokenとIP/Portを入れます。
    
    $ docker swarm join --token YYYYYYYYYYYYYYYYYYYYYYYYYY MANAGER-IP:PORT
    
  4. portainerで使用するボリューム: portainer_dataを作成します。
    
    $ docker volume create portainer_data
    
  5. dockerを用いてportainerを立ち上げます。Portainerへのアクセスは下記の例の場合19000番になります。
    
    $ docker run -d -p 18000:8000 -p 19000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
    
  6. インストールしたURL(例ではhttp://hogehoge.secureoss.jp:19000)にアクセスしてみます。httpという所はポイントです。ログイン画面が出てきます。

  7. Stackを作成します。今回は、OpenCTIという名前でStackを作成しました。

  8. Editorの中にymlファイルを書いていきます。OpenCTIのymlとしては下記のようなものを記入しました。TOKENはこちらを用いてユニークなものを作成しています。下記の設定中では仮に[TOKEN1]としています。各コネクタ毎に一つのUUIDが必要になります。
    
    version: '3'
    services:
      redis:
        image: redis:6.0.10
        restart: always
        volumes:
          - redisdata:/data
      elasticsearch:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.11.0
        volumes:
          - esdata:/usr/share/elasticsearch/data
        environment:
          - discovery.type=single-node
        restart: always
        ulimits:
          memlock:
            soft: -1
            hard: -1
          nofile:
            soft: 65536
            hard: 65536
      minio:
        image: minio/minio:RELEASE.2021-02-11T08-23-43Z
        volumes:
          - s3data:/data
        ports:
          - "9000:9000"
        environment:
          MINIO_ACCESS_KEY: [適当な値。説明文中ではMINIO_Aとしておく。]
          MINIO_SECRET_KEY: [こちらも適当な値。説明文中ではMINIO_Sとしておく。]
        command: server /data
        healthcheck:
          test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
          interval: 30s
          timeout: 20s
          retries: 3
        restart: always
      rabbitmq:
        image: rabbitmq:3.8-management
        environment:
          - RABBITMQ_DEFAULT_USER=guest
          - RABBITMQ_DEFAULT_PASS=guest
        volumes:
          - amqpdata:/var/lib/rabbitmq
        restart: always
      opencti:
        image: opencti/platform:4.5.5
        environment:
          - NODE_OPTIONS=--max-old-space-size=8096
          - APP__PORT=8080
          - APP__ADMIN__EMAIL=admin@hogehoge.secureoss.jp
          - APP__ADMIN__PASSWORD=xxxxxxxxx  : <-- 自分で設定する。パスフレーズは忘れずに
          - APP__ADMIN__TOKEN=[TOKEN1]
          - APP__LOGS_LEVEL=error
          - APP__LOGS=./logs
          - APP__REACTIVE=true
          - APP__COOKIE_SECURE=false
          - REDIS__HOSTNAME=redis
          - REDIS__PORT=6379
          - ELASTICSEARCH__URL=http://elasticsearch:9200
          - MINIO__ENDPOINT=minio
          - MINIO__PORT=9000
          - MINIO__USE_SSL=false
          - MINIO__ACCESS_KEY=[MINIO_A]
          - MINIO__SECRET_KEY=[MINIO_S]
          - RABBITMQ__HOSTNAME=rabbitmq
          - RABBITMQ__PORT=5672
          - RABBITMQ__PORT_MANAGEMENT=15672
          - RABBITMQ__MANAGEMENT_SSL=false
          - RABBITMQ__USERNAME=guest
          - RABBITMQ__PASSWORD=guest
          - PROVIDERS__LOCAL__STRATEGY=LocalStrategy
        ports:
          - "8080:8080"
        depends_on:
          - redis
          - elasticsearch
          - minio
          - rabbitmq
        restart: always
      worker:
        image: opencti/worker:4.5.5
        environment:
          - OPENCTI_URL=http://hogehoge.secureoss.jp:8080
          - OPENCTI_TOKEN=[TOKEN1]
          - WORKER_LOG_LEVEL=info
        depends_on:
          - opencti
        deploy:
          mode: replicated
          replicas: 6
        restart: always
      connector-history:
        image: opencti/connector-history:4.5.5
        environment:
          - OPENCTI_URL=http://hogehoge.secureoss.jp:8080
          - OPENCTI_TOKEN=[TOKEN1]
          - CONNECTOR_ID=[TOKEN2] # Valid UUIDv4
          - CONNECTOR_TYPE=STREAM
          - CONNECTOR_NAME=History
          - CONNECTOR_SCOPE=history
          - CONNECTOR_CONFIDENCE_LEVEL=3
          - CONNECTOR_LOG_LEVEL=info
        restart: always
      connector-export-file-stix:
        image: opencti/connector-export-file-stix:4.5.5
        environment:
          - OPENCTI_URL=http://hogehoge.secureoss.jp:8080
          - OPENCTI_TOKEN=[TOKEN1]
          - CONNECTOR_ID=[TOKEN2] # Valid UUIDv4
          - CONNECTOR_TYPE=INTERNAL_EXPORT_FILE
          - CONNECTOR_NAME=ExportFileStix2
          - CONNECTOR_SCOPE=application/json
          - CONNECTOR_CONFIDENCE_LEVEL=3
          - CONNECTOR_LOG_LEVEL=info
        restart: always
      connector-export-file-csv:
        image: opencti/connector-export-file-csv:4.5.5
        environment:
          - OPENCTI_URL=http://hogehoge.secureoss.jp:8080
          - OPENCTI_TOKEN=[TOKEN1]
          - CONNECTOR_ID=[TOKEN3] # Valid UUIDv4
          - CONNECTOR_TYPE=INTERNAL_EXPORT_FILE
          - CONNECTOR_NAME=ExportFileCsv
          - CONNECTOR_SCOPE=text/csv
          - CONNECTOR_CONFIDENCE_LEVEL=3
          - CONNECTOR_LOG_LEVEL=info
        restart: always
      connector-import-file-stix:
        image: opencti/connector-import-file-stix:4.5.5
        environment:
          - OPENCTI_URL=http://hogehoge.secureoss.jp:8080
          - OPENCTI_TOKEN=[TOKEN1]
          - CONNECTOR_ID=[TOKEN4] # Valid UUIDv4
          - CONNECTOR_TYPE=INTERNAL_IMPORT_FILE
          - CONNECTOR_NAME=ImportFileStix2
          - CONNECTOR_SCOPE=application/json
          - CONNECTOR_CONFIDENCE_LEVEL=3
          - CONNECTOR_LOG_LEVEL=info
        restart: always
      connector-import-file-pdf-observables:
        image: opencti/connector-import-file-pdf-observables:4.5.5
        environment:
          - OPENCTI_URL=http://hogehoge.secureoss.jp:8080
          - OPENCTI_TOKEN=[TOKEN1]
          - CONNECTOR_ID=[TOKEN5] # Valid UUIDv4
          - CONNECTOR_TYPE=INTERNAL_IMPORT_FILE
          - CONNECTOR_NAME=ImportFilePdfObservables
          - CONNECTOR_SCOPE=application/pdf
          - CONNECTOR_CONFIDENCE_LEVEL=3
          - CONNECTOR_LOG_LEVEL=info
          - PDF_OBSERVABLES_CREATE_INDICATOR=False
        restart: always
      connector-cve:
        image: opencti/connector-cve:4.5.5
        environment:
          - OPENCTI_URL=http://hogehoge.secureoss.jp:8080
          - OPENCTI_TOKEN=[TOKEN1]
          - CONNECTOR_ID=[TOKEN6]
          - CONNECTOR_TYPE=EXTERNAL_IMPORT
          - CONNECTOR_NAME=Common Vulnerabilities and Exposures
          - CONNECTOR_SCOPE=identity,vulnerability
          - CONNECTOR_CONFIDENCE_LEVEL=3
          - CONNECTOR_UPDATE_EXISTING_DATA=true
          - CONNECTOR_LOG_LEVEL=info
          - CVE_IMPORT_HISTORY=true # Import history at the first run (after only recent), reset the connector state if you want to re-import
          - CVE_NVD_DATA_FEED=https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-recent.json.gz
          - CVE_HISTORY_DATA_FEED=https://nvd.nist.gov/feeds/json/cve/1.1/
          - CVE_INTERVAL=7 # In days, must be strictly greater than 1
        restart: always
      connector-mitre:
        image: opencti/connector-mitre:4.5.5
        environment:
          - OPENCTI_URL=http://hogehoge.secureoss.jp:8080
          - OPENCTI_TOKEN=[TOKEN1]
          - CONNECTOR_ID=[TOKEN7]
          - CONNECTOR_TYPE=EXTERNAL_IMPORT
          - CONNECTOR_NAME=MITRE ATT&CK
          - CONNECTOR_SCOPE=identity,attack-pattern,course-of-action,intrusion-set,malware,tool,report,external-reference-as-report
          - CONNECTOR_CONFIDENCE_LEVEL=15
          - CONNECTOR_UPDATE_EXISTING_DATA=true
          - CONNECTOR_LOG_LEVEL=info
          - MITRE_ENTERPRISE_FILE_URL=https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json
          - MITRE_PRE_ATTACK_FILE_URL=https://raw.githubusercontent.com/mitre/cti/master/pre-attack/pre-attack.json
          - MITRE_MOBILE_ATTACK_FILE_URL=https://raw.githubusercontent.com/mitre/cti/master/mobile-attack/mobile-attack.json
          - MITRE_INTERVAL=7 # In days, must be strictly greater than 1
        restart: always
    volumes:
      esdata:
      s3data:
      redisdata:
      amqpdata:
    
  9. ymlファイルを入力したら、一番下(スクロールして下さい)の「Deply the stack」をクリックしましょう。サービスがスタートしていきます。

  10. 起動にはかなりの時間がかかります(だいたい落ち着くまで体感で10分ぐらいはかかります)。左ペインの「Service」を選択して、メインのサービス類が「replicated 1/1」のようになったら起動しています。最終的には、「opencti/connector-import-file-pdf-observables」以外は1/1になるはずです。

  11. うまく動作しない場合には、サービスをクリックして、赤くなっている「rejected」などをクリックすると、ログが出力されます。このログを頼りに、デバッグをしていきましょう。

  12. サービスが全て立ち上がると、OpenCTIにログインできます。ここでのユーザ名・パスワードは、前述のymlで設定したものになります。


ここまでのまとめ

ここまででOpenCTIが立ち上がるところまで行きました。次回はログインしてからの設定と、MISPとの接続を紹介します。


セキュリティ系連載案内

日々のメモを更新しています。

セキュリティ関係ニュースを更新しています。個別で情報出せるようになる前の簡単な情報・リンクなんかも載せていきます。

セミナー情報1

コンピュータセキュリティシンポジウム(CSS)2021併設のワークショップ、 OSSセキュリティ技術ワークショップ(OWS) 2021の企画講演セッション及び、 一般論文セッションをさせていただきます。

今年もオンラインでの開催となり、OWSトラックの一般論文セッションと企画セッションを行いますので,ご参加よろしくお願いいたします。

https://www.iwsec.org/ows/2021/


OSSに関するお困りごとは サイオス OSSよろず相談室まで

サイオスOSSよろず相談室 では、OSSを利用する中で発生する問題に対し、長年培ってきた技術力・サポート力をもって企業のOSS活用を強力に支援します。Red Hat Enterprise Linux のほか、CentOS をご利用されている環境でのサポートも提供いたします。

前へ

PHPの脆弱性情報(Important: CVE-2021-21703)と修正バージョン( 7.4.25, 8.0.12 )

次へ

BIND 9の脆弱性情報(Medium: CVE-2021-25219)と新バージョン(9.11.36, 9.16.22, 9.17.19 )