Monitoring으로 로그 표시(인증+TLS 유효판)

소개



일본이 영화를 맞이했을 무렵, Elastic에서는 BASIC 서브스크립션으로 Security가 유효하게 되었습니다!
(게다가 갱신이 멈췄다고 생각되고 있던 6계에도 백포트되어 6.8가!)

이번에는 이전 Monitoring으로 로그 보기 에서 만든 docker-compose.yml 에서도 보안을 활성화해 보겠습니다.
(2019.05.20 추가) 보안을 활성화하면 TLS도 활성화하지 않으면 화나게 됩니다.

준비



다음을 보면서 컨테이너에서 TLS를 사용할 수 있습니다.

설정 변경



docker-compose.yml 수정



elasticsearch에서 보안을 활성화하고 kibana에서 사용자 이름과 암호를 지정합니다.
패스워드는 ELASTIC_PASSWORD 로 지정하고 있습니다만, 어디까지나 테스트라고 하는 것으로 적당한 것을 지정하고 있습니다 (실제로 사용할 때는, 제대로 설정하지 않으면입니다만).

docker-compose.yml
version: '2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.0.0-SNAPSHOT
    container_name: elasticsearch4
    environment:
      - cluster.name=docker-cluster
      - node.name=node-1
      - cluster.initial_master_nodes=node-1
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - path.repo=/usr/share/elasticsearch/snapshots
      - xpack.security.enabled=true
      - ELASTIC_PASSWORD=elastic
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.key=$CERTS_DIR/elasticsearch4/elasticsearch4.key
      - xpack.security.transport.ssl.certificate=$CERTS_DIR/elasticsearch4/elasticsearch4.crt
      - xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata1:/usr/share/elasticsearch/data
      - ./certs:$CERTS_DIR
    ports:
      - 9204:9200
    networks:
      - esnet
  kibana:
    image: docker.elastic.co/kibana/kibana:8.0.0-SNAPSHOT
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch4:9200
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=elastic
    container_name: kibana4
    ports:
      - 5605:5601
    networks:
      - esnet
  beats:
    image: docker.elastic.co/beats/filebeat:8.0.0-SNAPSHOT
    container_name: beats4
    user: root
    environment:
      - ELASTICSEARCH_CONTAINER_NAME=elasticsearch4
      - ELASTICSEARCH_HOSTS=http://elasticsearch4:9200
      - KIBANA_HOST=http://kibana4:5601
    volumes:
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
    networks:
      - esnet

volumes:
  esdata1:
    driver: local

networks:
  esnet:
docker-compose.yml 와 같은 디렉토리에 .env 도 만들어 둡니다.

.env
CERTS_DIR=/usr/share/elasticsearch/config/certs

filebeat.yml 수정


filebeat.yml 그러나 사용자 이름과 암호를 지정합니다.

filebeat.yml
filebeat.autodiscover:
  providers:
    - type: docker
      labels.dedot: true
      templates:
        - condition:
            contains:
              docker.container.name: ${ELASTICSEARCH_CONTAINER_NAME:elasticsearch}
          config:
             - module: elasticsearch
               server:
                 enabled: true
                 input:
                   type: docker
                   containers.ids:
                     - "${data.docker.container.id}"
setup.kibana:
  host: "${KIBANA_HOST:kibana:5601}"
  username: elastic
  password: elastic
output.elasticsearch:
  hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}'
  username: elastic
  password: elastic

부팅



다음 명령으로 컨테이너를 시작합니다.
$ docker-compose up -d

문제가 없으면 로그를 수집하고 Monitoring에서 로그를 볼 수 있어야합니다.
하지만 Monitoring을 보면 다음과 같은 오류 메시지가 나타납니다.
[illegal_argument_exception] Fielddata is disabled on text fields by default. Set fielddata=true on [event.dataset] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.: Check the Elasticsearch Monitoring cluster network connection or the load level of the nodes.

무슨 일이야?


Set fielddata=true on [event.dataset] 

라고 표시됩니다. Mapping을 보면...
{
   "mapping": {
     "properties": {
       "@timestamp": {
         "type": "date"
       },
(snip)
       "event": {
         "properties": {
           "created": {
             "type": "date"
           },
           "dataset": {
             "type": "text",
             "fields": {
               "keyword": {
                 "type": "keyword",
                 "ignore_above": 256
               }
             }
           },
(snip)
}
event.dataset 하지만 text 형이 되어 버리고 있네요・・・
template가 들어갈 것이므로, 제대로 event.datasetkeyword 형이 될 것인데.

Filebeat의 처리를 제대로 본 것은 아닙니다만, 아무래도 template가 등록되기 전에 Rollover용 Index( filebeat-8.0.0-{now/d}-000001 )가 등록되어 버리는 것 같습니다.



ILM도 활성화되지 않았습니다.
하는 일은 같을 것인데, 왜 전에는 잘 했을까? ? ?
template가 남아 있었는지...
-> 버그였던 것 같다. 지금 (2019.05.15 현재는 수정되었습니다)

게다가 보안에 관계없고 orz

다루다



아래의 순서로 기동해 봅니다.
  • docker-compose up -d elasticsearch kibana
  • docker-compose run beats setup -e --modules elasticsearch
  • DELETE filebeat-*
  • Rollover Index 등록
  • docker-compose up -d beats

  • Rollover용 Index는 다음과 같은 느낌으로 등록합니다.
    PUT %3Cfilebeat-8.0.0-%7Bnow%2Fd%7D-000001%3E
    {
       "aliases": {
         "filebeat-8.0.0": {}
       }
    }
    

    그래서 다시 Index를 확인하면 ...



    제대로 된 것 같습니다.

    결론



    보안 자체는 아무런 문제없이 사용할 수있었습니다.
    라고 할까, BASIC로 시큐리티가 유효하게 되는 것은 좋네요. 빨리 공식 출시되기를 바랍니다.

    좋은 웹페이지 즐겨찾기