카테고리 보관물: config

Increase virtual memory vm.max_map_count in boot2docker

I want to run Elasticsearch 5.0 with my Docker Toolbox. But it requires us to increase the vm.max_map_count to 262144 (https://www.elastic.co/guide/en/elasticsearch/reference/master/vm-max-map-count.html). I can do it by running these commands.

docker-machine ssh default
sysctl -w vm.max_map_count=262144
# Update the vm.max_map_count setting in /etc/sysctl.conf

setting check!.
cat /proc/sys/vm/max_map_count  

But they are reset after I re-boot my host. How to make boot2docker keeps these settings?

 

You can put it in vi /var/lib/boot2docker/bootlocal.sh

# Update the vm.max_map_count setting
sysctl -w vm.max_map_count=262144
chmod +x /var/lib/boot2docker/bootlocal.sh

Docker Toolbox 설치, 메모리 확장, 디스크 확장, timezone변경

Docker Toolbox 기본 설치 과정에서 Docker VM의

– 기본 설정 메모리 크기 확장

– 디스크 확장, 공유 폴더 추가 병행

– Timezone변경

정도로 진행한다.

 

** update :: 교차점 생성, MACHINE_STORAGE_PATH 설정은 

   Kitematic 사용하지 않을 경우에만 하자.

   docker vm ssh접속으로 동작에는 문제 없지만 (= vmware에 linux설치후 그 위에 동작하는 docker)

   host(windowns)에서 docker-machine 명령등에 직접 연결이 안된다.

   ex) 에러 메시지 종류

   Could not determine IP from docker-machine.

   command exit status 255
Error checking TLS connection: Host is not running

   등…

   windows의 OpenSSH와 docker-toolbox의 인증서 위치나 권한 뭐 그런 것들 때문같은데,

   괜히 시간 낭비하지 말자. 그냥 pc검증 환경일 뿐이니…

 

1. 설치 디렉토리 생성 & 링크 (optonal)

– D드라이브에 Docker 디렉토리 생성 (D:\Docker) <– 본인이 희망하는.

– 혹시 모를 일을 대비해서 /Users/MY_NAME/.docker를 D:\Docker로 교차점 생성

C:\Users\MY_NAME> mklink /J .docker "D:\Docker"
.docker <<===>> D:\Docker에 대한 교차점을 만들었습니다.

2. 환경변수 설정 (& 재시작) (optional)

  – Docker 저장소 위치 변경

 

3. Docker Toolbox 다운로드 & 설치

– 다운로드 : https://download.docker.com/win/stable/DockerToolbox.exe

– 설치 진행 : 진행 과정 중 기본 체크 박스 상태 그대로 진행, 설치 완료 후 재시작 불필요
https://docs.docker.com/toolbox/toolbox_install_windows/

 

– 3개의 바로가기 아이콘 생성됨

1) Oracle VM VirtualBox : “C:\Program Files\Oracle\VirtualBox\VirtualBox.exe” deafult VM이 생성되어 있는 상태

2) Kitematic (Alpha) : “C:\Program Files\Docker Toolbox\kitematic\Kitematic.exe”

3) Docker Quickstart Terminal : “C:\Program Files\Git\bin\bash.exe” –login -i “C:\Program Files\Docker Toolbox\start.sh”

 

4. Docker VM 실행 & 상태 확인

– Docker Quickstart Terminal 바로가기 실행

 

 

– IP 확인 (기본 설정대로 라면 NAT구성으로 192.168.99.100) : 위 그림 IP정보 참고

 

5. Oracle VM VirtualBox : Docker VM이미지 메모리 확장, 공유 폴더 추가

 5-0. VM중지 = ‘Docker Quickstart Terminal’에서 아래 명령 실행

$ docker-machine stop

 5-1. Oracle VM VirtualBox실행 & default 우측 클릭 > 닫기 전원 끄기

 5-2. default > 설정 : 기본메모리를 1024MB에서 4096MB로 변경 (컨테이너의 Out-Of-Memory를 덜 보려면…)

 

 

5-3. 공유폴더 추가

– D:\Docker\data 디렉토리 생성

– 이 폴더를 공유 폴더로 추가 & 자동마운트 설정

 

 

 5-4. 디스크 추가

– 저장소 > 새 디스크 만들기 > VMDK 선택 > 동적 할당 > data_disk이름 & 100GB 설정 > 만들기
(경로 : D:\Docker\machines\default\default\data_disk.vmdk)

 

 

– ‘Docker Quickstart Terminal’ 에서 docker-machine start

– Docker쉘 접속 후

1) fdisk /dev/sdb : 파티셔닝

2) mkfs.ext4 /dev/sdb1 : ext4 포맷

3) mount 해보기

docker@default:~$ sudo -i
root@default:~# fdisk -l <----------- 
  ....
  Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors <-----------
  Units: sectors of 1 * 512 = 512 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes


root@default:~# fdisk /dev/sdb <---------
  ...
  Command (m for help): m <--------
  Command (m for help): g <-------- Linux FileSystem
  Command (m for help): n <-------- 파티션 생성
  Partition type
     p   primary (0 primary, 0 extended, 4 free)
     e   extended (container for logical partitions)
  Select (default p): p <-----------
  Partition number (1-4, default 1): 
  First sector (2048-209715199, default 2048): 
  Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199): 

  Created a new partition 1 of type 'Linux filesystem' and of size 100 GiB.

  Command (m for help): p
  Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors
  Units: sectors of 1 * 512 = 512 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes
  Disklabel type: gpt
  Disk identifier: 54EDF7CB-5770-47D4-9DF6-0F4CE1F48054

  Device     Start       End   Sectors  Size Type
  /dev/sdb1   2048 209715166 209713119  100G Linux filesystem

  Command (m for help): w <--------------
  The partition table has been altered.
  Calling ioctl() to re-read partition table.
  Syncing disks.

root@default:~# fdisk -l <--------------
  ...
  Device     Start       End   Sectors  Size Type
  /dev/sdb1   2048 209715166 209713119  100G Linux filesystem  <--------------

root@default:~# mkfs.ext4 /dev/sdb1 <--------------
  ...
  Writing superblocks and filesystem accounting information: done   

root@default:~# mkdir -p /mnt/sdb1
root@default:~# mount /dev/sdb1 /mnt/sdb1 <----------- 
root@default:~# df -h
  Filesystem                Size      Used Available Use% Mounted on
  tmpfs                     3.5G    229.6M      3.2G   6% /
  tmpfs                     1.9G         0      1.9G   0% /dev/shm
  /dev/sda1                17.8G     46.5M     16.9G   0% /mnt/sda1
  cgroup                    1.9G         0      1.9G   0% /sys/fs/cgroup
  /c/Users                476.2G    189.5G    286.7G  40% /c/Users
  /data                     3.6T      1.4T      2.2T  39% /data
  /dev/sda1                17.8G     46.5M     16.9G   0% /mnt/sda1/var/lib/docker
  /dev/sdb1                97.9G     59.6M     92.9G   0% /mnt/sdb1 <----------

 

– 자동 마운트 설정 : 아래 경로에 bootlocal.sh 파일 생성(실행 권한부여) 후 mount명령 추가

(이 방법외에 다른 방법 찾기 귀찮아서, 혹시 아는 분은 댓글로…)

root@default:~# cd /var/lib/boot2docker
root@default:/var/lib/boot2docker# vi bootlocal.sh 
  #!/bin/sh
  mount /dev/sdb1 /mnt/sdb1
  :wq (저장)
root@default:/var/lib/boot2docker# chmod u+x bootlocal.sh

– ‘Docker Quickstart Terminal’ 에서 docker-machine restart

– docker vm에 쉘 접속 후 확인 : 메모리 크기 등

 

 

6. Timezone변경

– 현재 시간 확인 : PC의 현재 시간과 동일하면 끝, 아래와 같이 아니라면

docker@default:~$ date
Mon Jun 17 21:50:01 UTC 2019  <— 엉뚱한 시간이 나온다. (9시간 전?)

– 다음과 같이 진행 후 docker-machine restart

docker@default:~$ sudo -i
root@default:~# cd /var/lib/boot2docker

root@default:/var/lib/boot2docker# tce-fetch.sh tzdata.tcz
root@default:/var/lib/boot2docker# mkdir ext
root@default:/var/lib/boot2docker# mount tzdata.tcz ext -t squashfs -o loop,ro,bs=4096
root@default:/var/lib/boot2docker# cp ext/usr/local/share/zoneinfo/Asia/Seoul ./Asia-Seoul.tz

root@default:/var/lib/boot2docker# umount ext
root@default:/var/lib/boot2docker# rm -rf ext tzdata.tcz

root@default:/var/lib/boot2docker# vi bootlocal.sh
    #!/bin/sh
    mount /dev/sdb1 /mnt/sdb1
    cp /var/lib/boot2docker/Asia-Seoul.tz /etc/localtime
    :wq (저장)
root@default:/var/lib/boot2docker# chmod u+x bootlocal.sh

((((( 재시작 후 접속 )))))

docker@default:~$ date
Tue Jun 18 07:04:21 KST 2019 <-- PC시간과 동일

(참고 : https://github.com/boot2docker/boot2docker/issues/476)

 

 

[기타]

– container 이미지 저장 위치 :

$ docker info
  Containers: 3
  ...
  Docker Root Dir: /mnt/sda1/var/lib/docker <------------
  ...
  Product License: Community Engine

$ sudo i
# cd /mnt/sda1/var/lib/docker
# find . -name mysql | cut -f 1,2,3 -d "/" | uniq | xargs du -h -d 0
  40.0K   ./overlay2/331e15e384ea042923fbc7d933359fa89718cc38215d0056ab47bfbba2e445f2
  431.8M  ./overlay2/b7f24200745390db507cca92e2d6b32778d77a71f58d8d776dd04be46912b405
  313.6M  ./overlay2/00a4a9d710111c024838b47c3d1a1ce1457f2cd345e33748e21bac3c92364792

대충 /mnt/sd1/var/lib/docker/overlay쯤인가보네

참고 : https://stackoverflow.com/questions/19234831/where-are-docker-images-stored-on-the-host-machine

Pydio 2G초과하는 대용량 업로드 설정방법

Pydio(구 AjaXplorer) 2G초과하는 대용량 업로드 설정에 있어 해야할 방법을 적으려고한다.
1. PHP 설정

php.ini 파일에서 수정할 것들

 

max_execution_time =120

max_input_time = 60

memory_limit =256M

post_max_size =2G

upload_max_filesize =2G

default_socket_timeout = 60

필자는 최대 6GB 까지 업로드 하려고 하기 때문에 다음과 같이 수정하고 아파치를 재시작하였다.

(각 설정별의 내용을 이해하고 있다면 다르게 해도 괜찮다. 이건 필자의 개인설정이다.)

max_execution_time = 0

max_input_time = -1 

memory_limit =512M

post_max_size =5G

upload_max_filesize =5G

default_socket_timeout = 1800

max_execution_time (무제한 : 0) 

– 최대 실행시간

파일용량이 커지면 그만큼 시간이 길어져야 하지만 적절한 시간을 모르므로 제한을 해제했다.

max_input_time (무제한 : -1)

– php 엔진이 데이터를 업로드 받는 시간

파일용량이 커지면 그만큼 시간이 길어져야 하지만 적절한 시간을 모르므로 제한을 해제했다.

memory_limit

– 파일 용량이 커지면 그만큼 메모리의 용량도 늘어야 한다고 한다.

post_max_size

– Post 방식으로 전송될 최대 데이터 크기

upload_max_filesize

– 업로드할 파일 최대크기 (필자의 서버는 5G가 한계)

default_socket_timeout

 

– 연결시간 유지 (초단위이고 적당히 30분 잡아주었다.)

2. Pydio 설정

여기까지  php.ini 만 수정하면 문제없이 될 것같지만 사실 Pydio 내부에서도 수정이 필요하다.

안그러면 파일업로드 제한에 걸리거나 목록에서 업로드한 파일의 용량이 제대로 표시되지 않거나 v파일이 불완전하게 업로드되는 현상이 발생한다.

 

2.1. 목록에서 파일용량 제대로 표시하기

관리자 아이디로 pydio에 로그인 한 후

“설정 – Application Parameters – Feature plugins – Workspaces Drivers – File System(Stendard) ” 에서

REAL SIZE PROBING 의 설정을 Yes로 바꾸어준후 오른족 상단에 저장버튼클릭

 

2.2 Jumploader 설치 및 활성화

Jumploader를 공식 사이트에 가서 최신버전을 받는다. 필자는 2.27.0 버전을 사용했다.

Jumploader – http://jumploader.com/download.html

다운받은 “jumploader_z.jar” 를 “public_html\plugins\uploader.jumploader” 안에 압축 풀지않고 그대로 넣어둔다.

“설정 – Application Parameters – Feature plugins – Uploaders -java(Big Files)”에서

Install Applet 버튼을 눌러서 설치, 그담에 ENABLED을 Yes로 바꾼 다음 오른족 상단에 저장버튼클릭

그리고 Standard / Remote Server / PLUploader 는 꺼주면 끝.

설치가 다 올바르게되면 업로드 버튼 누를 시에 아래와 같은 창으로 바뀐다.

[참고] 만약 Uploder에서 아무런 리스트가 나타나지 않는다면?

필자에게 발생한 것이고 임시방편으로 찾은 방법을 적어둔다.

서버에서 “public_html\plugins” 에 접근하여 “uploader.flex”의 폴더명을 바꾼다.

uploader.flex → _uploader.flex

“설정 – Application Parameters – Feature plugins” 에서 Refresh plugins cache 를 클릭

“설정 – Application Parameters – Feature plugins – Uploaders” 에 옆에 있는 새로고침 버튼 클릭하면 나온다.

필요한 설정을 다 하고 나면 “_uploader.flex”의 폴더명을 원래대로 바꾸고

_uploader.flex → uploader.flex

“설정 – Application Parameters – Feature plugins” 에서 Refresh plugins cache 를 클릭하면 끝.

flex플러그인이 없으면 업로드를 했는데 업로드가 안되는 현상이 발생하므로 한번 용량작은 파일로 테스트 해봐야한다.

* 포럼을 뒤지고 구글링을 해도 무슨 이유인지는 밝히지를 못했다. 아는이 있으면 덧글로 좀 알려줘요.

[참고] 끝마치기 전에 개인적인 생각

보통 대용량파일은

목록에서 제대로 용량이 표시가 안되고 다운로드가 안되는게 문제지 업로드가 문제인건 아니므로

그냥 “2.1 목록에서 파일용량 제대로표시하기” 까지만 진행한 다음에 업로드는 FTP로 해서 따로 올리는 것이 낫다고 생각한다. 파일을 업로드할 경로는 다음과 같다.

Default Files – “public_html\data\files”

My Files – “public_html\data\personal”

Windows WIFI-AP 목록과 KEY 추출

## backup profile
netsh wlan export profile key=clear folder=C:\wifi_profiles (폴더 없으면 C:\ 에다가)

## restore profile
netsh wlan add profile filename=”c:\wifi_profiles\totoli_AP.xml” user=all (백업된 프로파일 하나씩 복원)

[Docker] docker-compose 를 이용해 ELK 구축하기 ( + mySql, Nori)

1. ELK ?

Elasticsearch, Logstash, Kibana 오픈 소스 프로젝트 3개를 합쳐서 ELK 라고 한다. Elasticsearch 는 검색 및 분석 엔진으로 무료버전으로도 기본적인 기능은 충분히 사용가능하다. Logstash는 여러 소스에서 동시에 데이터를 수집하여 변환한 후 Elasticsearch 와 같은 곳에 ‘stash’로 전송하는 서버 사이드 데이터 처리 파이프라인을 말한다. Kibana 는 사용자가 Elasticsearch 를 시각화하여 사용할수 있는 툴이다.

여기서는 이미 사용하고 있는 docker 기반 mySql 을 Elasticsearch 에 logstash 를 이용해 동기화 하고, 검색하는 부분만 포스팅할 예정이다.

 

2. Nori ?

한글 검색을 올바르게 수행하기 위해서는 형태소 분석기 plug-in 을 Elasticsearch 에 따로 설치해주어야 하는데, 다른 다양한 형태소 분석기들도 많지만 필자는 Elasticsearch 공식문서를 보면서 작업하기 수월하기 위해 Nori 형태소 분석기를 사용하기로 하였다. nori는 elasticsearch 가 실행된 상태에서 해당 bash 에 접속해 설치하면 된다.

$ docker exec -it elasticsearch /bin/bash 
$ bin/elasticsearch-plugin install analysis-nori #elasticsearch container 에서 명령

nori를 이용한 검색을 해야하는 데이터 컬럼에 대해서는 반드시 mapping analyzer 셋팅을 해주어야 한다. 예를들어 ‘name’이라는 column 에 형태소 분석을 이용한 한글검색이 가능하게 하고자 한다면 mapping 은 다음과 같은 형태일 수 있다.

 "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          },
          "analyzer":"nori_analyzer"
        }

 

3. docker-compose

version: '3.2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.1 #기본 이미지 사용
    container_name: elasticsearch
    environment:
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
      discovery.type: single-node #간단한 local 테스트를 위해 single-node로 구성
    volumes:
      - /usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elk
  logstash:
    container_name: logstash
    image: docker.elastic.co/logstash/logstash:7.6.1
    environment:
      LS_JAVA_OPTS: "-Xmx256m -Xms256m"
    volumes:
      - type: bind
        source: ./config/logstash/config/logstash.yml
        target: /usr/share/logstash/config/logstash.yml
        read_only: true
      - type: bind
        source: ./config/logstash/pipeline
        target: /usr/share/logstash/pipeline
        read_only: true
      - ./jar/mysql-connector-java-8.0.18.jar:/usr/share/logstash/logstash-core/lib/jars/mysql-connector-java-8.0.18.jar #mysql 사용을 위한 jdbc-connector 다운
    networks:
      - elk
    depends_on:
      - elasticsearch #elasticsearch 가 실행된 이후 logstash 실행되도록 depends_on 설정
  kibana:
    container_name: kibana
    image: docker.elastic.co/kibana/kibana:7.6.1
    ports:
      - 5601:5601
    networks:
      - elk
    depends_on:
      - elasticsearch #elasticsearch 가 실행된 이후 kibana 실행되도록 depends_on 설정
    
networks:
 elk:
  external:
    name: mysql-network #이미 사용하고 있는 db와 연결을 위해 mysql-docker network 와 연결이 되도록 external 설정을 따로 해주었다. 

volumes:
 elasticsearch: #volume container 사용
    

 

이미 떠있는 mysql container 와의 연결을 위해 external network 설정을 따로 해주었으나, 만약 elk 구축과 함께 database 를 실행한다면 external 연결은 해줄필요가 없다. 기본적인 ELK 설정을 거이 따르고 있으며 여기서는 mysql 연결을 위한 부분과 single-node 사용하는 부분만 수정하였다.

4. mysql 과 동기화 작업 설정

동기화 하고 싶은 데이터가 있다면 logstash.conf 파일에서 설정해주면 된다. 여기서는 crontab 과 수정일을 이용하여 마지막 데이터를 동기화해 가지고 오도록 작업하였다.

input {
  jdbc {
    jdbc_driver_library => "/usr/share/logstash/logstash-core/lib/jars/mysql-connector-java-8.0.18.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://[mysql-container-name]:[mysql-container-host]/allpal?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Seoul&autoReconnect=true"
    jdbc_user => "[mysql-id]"
    jdbc_password => "[mysql-password]"

    columns_charset => {
      "[한글데이터를 가지고 있는 column 명]" => "UTF-8"
    }

    statement => "SELECT *, UNIX_TIMESTAMP(modification_time) as unix_ts_in_secs FROM [table name] WHERE 
    (UNIX_TIMESTAMP(modification_time) > :sql_last_value AND modification_time < NOW())"

    jdbc_paging_enabled => true
    use_column_value => true
    tracking_column => "unix_ts_in_secs"
    tracking_column_type => "numeric"
    clean_run => true
    schedule => "*/5 * * * * *"  # crontab 표기법의 스케쥴 설정
  }
}

output {
  elasticsearch {
    hosts => "elasticsearch:9200"
    index => "[index명]"
    document_id => "%{_id}"
  }
  stdout {
    codec => rubydebug
  }
}

[대괄호]안에 있는 부분들은 해당 상황에 맞게 입력하면 되는 값이며, 여기서는 위에서 언급한것처럼 modification_time 이라는 수정일 컬럼을 이용하여 동기화하였다. 새로 추가되거나, 수정/삭제 된 경우에도 데이터가 자동으로 동기화 되기 위해서 다음과 같이 작업을 진행하였다.

 

각 환경에 맞게 수정한 docker-compose.yml 파일과 logstash.conf 등 설정파일들 준비가 완료되었다면 docker-compose.yml 파일이 있는 디렉토리에서 docker-compose up 을 통해 해당 파일이 실행되는것을 확인할 수 있으며, localhost:5601 에 접속하여 kibana 에서 편하게 실제 index가 들어간 모습과, mapping 등을 확인할 수 있다.

To hide removable drives from file explorer in left tree view

To hide removable drives from the Navigation Pane in Windows 10, follow the instructions below.

  1. Open Registry Editor.
  2. Go to the following Registry key:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\DelegateFolders\{F5FB2C77-0E2F-4A16-A381-3E560C68BC83}

    Tip: See How to jump to the desired Registry key with one click.

  3. Rename the subkey {F5FB2C77-0E2F-4A16-A381-3E560C68BC83} by adding a hyphen ‘-‘ before it so its new name is -{F5FB2C77-0E2F-4A16-A381-3E560C68BC83}. See the following screenshot:windows 10 hide remobable drives navigation pane
  4. If you are running 64-bit Windows 10, repeat the step above here:
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\DelegateFolders
  5. Close all Explorer windows for the change to take effect.

That’s it.
Before:

before
After:

after
To restore removable drives in the navigation pane, rename the mentioned subkey from -{F5FB2C77-0E2F-4A16-A381-3E560C68BC83} back to {F5FB2C77-0E2F-4A16-A381-3E560C68BC83}.

You can save your time and use Winaero Tweaker to hide or show Removable Drives in the navigation pane.

Docker – Oracle 12c 설치

Oralce 12C를 설치할 디렉토리 생성 및 권한 변경

 mkdir vm_ora12c

chmod -R a+w vm_ora12c

Oracle 12c 이미지 조회

docker search oracle

[docker_test@blue ~]$ docker search oracle

INDEX       NAME                                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

docker.io   docker.io/oraclelinux                         Official Docker builds of Oracle Linux.         515       [OK]

docker.io   docker.io/sath89/oracle-12c                   Oracle Standard Edition 12c Release 1 with…   409                  [OK]

docker.io   docker.io/frolvlad/alpine-oraclejdk8          The smallest Docker image with OracleJDK 8…   343                  [OK]

docker.io   docker.io/alexeiled/docker-oracle-xe-11g      This is a working (hopefully) Oracle XE 11…   273                  [OK]

docker.io   docker.io/sath89/oracle-xe-11g                Oracle xe 11g with database files mount su…   224                  [OK]

docker.io   docker.io/wnameless/oracle-xe-11g             Dockerfile of Oracle Database Express Edit…   115                  [OK]

docker.io   docker.io/jaspeen/oracle-11g                  Docker image for Oracle 11g database            77                   [OK]

docker.io   docker.io/isuper/java-oracle                  This repository contains all java releases…   55                   [OK]

docker.io   docker.io/oracle/openjdk                      Docker images containing OpenJDK Oracle Linux   49                   [OK]

docker.io   docker.io/airdock/oracle-jdk                  Docker Image for Oracle Java SDK (8 and 7)…   39                   [OK]

docker.io   docker.io/sath89/oracle-ee-11g                Dockerfile of Oracle Database Enterprise E…   34                   [OK]

docker.io   docker.io/cogniteev/oracle-java               Oracle JDK 6, 7, 8, and 9 based on Ubuntu …   24                   [OK]

docker.io   docker.io/ingensi/oracle-jdk                  Official Oracle JDK installed on centos.        21                   [OK]

docker.io   docker.io/oracle/nosql                        Oracle NoSQL on a Docker Image with Oracle…   17                   [OK]

docker.io   docker.io/n3ziniuka5/ubuntu-oracle-jdk        Ubuntu with Oracle JDK. Check tags for ver…   16                   [OK]

docker.io   docker.io/sgrio/java-oracle                   Docker images of Java 7/8/9/10 provided by…   16                   [OK]

docker.io   docker.io/andreptb/oracle-java                Debian Jessie based image with Oracle JDK …   7                    [OK]

docker.io   docker.io/flurdy/oracle-java7                 Base image containing Oracle’s Java 7 JDK       5                    [OK]

docker.io   docker.io/davidcaste/debian-oracle-java       Oracle Java 8 (and 7) over Debian Jessie        4                    [OK]

docker.io   docker.io/martinseeler/oracle-server-jre      Oracle’s Java 8 as 61 MB Docker container.      4                    [OK]

docker.io   docker.io/teradatalabs/centos6-java8-oracle   Docker image of CentOS 6 with Oracle JDK 8…   4

docker.io   docker.io/publicisworldwide/oracle-core       This is the core image based on Oracle Lin…   1                    [OK]

docker.io   docker.io/bitnami/oraclelinux-extras          Oracle Linux base images                        0                    [OK]

docker.io   docker.io/pivotaldata/oracle7-test            Oracle Enterprise Linux (OEL) image for GP…   0

docker.io   docker.io/softwareplant/oracle                oracle db                                       0                    [OK]

Oracle docker image download

docker pull sath89/oracle-12c

[docker_test@blue ~]$ docker pull sath89/oracle-12c

Using default tag: latest

Trying to pull repository docker.io/sath89/oracle-12c …

latest: Pulling from docker.io/sath89/oracle-12c

863735b9fd15: Pull complete

4fbaa2f403df: Pull complete

44be94a95984: Pull complete

a3ed95caeb02: Pull complete

b8bc6e8767ee: Pull complete

c918da326197: Pull complete

448e1619a038: Pull complete

faadd00cf98e: Downloading [====>                                              ] 266.9 MB/2.768 GB

fab7f453b7c6: Download complete

c98ac63d2108: Download complete

download 된 image 확인

[docker_test@blue ~]$ docker images

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE

docker.io/sath89/oracle-12c   latest              ee3351d51185        2 months ago        5.7 GB

실행

docker run –name oracle12c -d -p (외부포트):8080 -p (외부포트):1521 -v (외부경로):/u01/app/oracle sath89/oracle-12c

[docker_test@blue ~]$ docker run –name oracle12c -d -p 28080:8080 -p 21521:1521 -v /home/docker_test/vm_ora12c:/u01/app/oracle sath89/oracle-12c

185cb33e3b92b6473c13f35e687b960d42da9e547ceb600e5a181d0ed7fca631

실행 로그 확인

 docker logs -f oracle12c

[docker_test@blue ~]$ docker logs -f oracle12c

Database not initialized. Initializing database.

Starting tnslsnr

Copying database files

1% complete

3% complete

11% complete

18% complete

26% complete

37% complete

Creating and starting Oracle instance

40% complete

45% complete

……

ls: cannot access /docker-entrypoint-initdb.d/*: No such file or directory

Import finished

Database ready to use. Enjoy! 😉

oracle 의 사용자 계정 생성

docker exec  -it oracle12c /bin/bash

su oracle

export PATH=$PATH:$ORACLE_HOME/bin

sqlplus /as sysdba

create user testuser identified by oracle;

grant dba to testuser;

exit (연속)

[docker_test@blue ~]$ docker exec -it oracle12c /bin/bash

root@185cb33e3b92:/# su oracle

oracle@185cb33e3b92:/$ export PATH=$PATH:$ORACLE_HOME/bin

oracle@185cb33e3b92:/$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Mon Oct 29 05:24:43 2018

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Connected to:

Oracle Database 12c Standard Edition Release 12.1.0.2.0 – 64bit Production

SQL> create user testuser identified by oracle

2  /

User created.

SQL> grant dba to testuser

2  /

Grant succeeded.

해당 유저로 접속 확인

 docker exec -it oracle12c sqlplus testuser/oracle

[docker_test@blue ~]$ docker exec -it oracle12c sqlplus testuser/oracle

SQL*Plus: Release 12.1.0.2.0 Production on Mon Oct 29 05:26:30 2018

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Connected to:

Oracle Database 12c Standard Edition Release 12.1.0.2.0 – 64bit Production

SQL>

 

SYSMON + ELK STACK을 이용하여 간단한 EDR 만들기

개요

현재 Microsofts에서 제공하는 도구 모음인 Sysinternalsuite에는 Sysmon이라는 도구가 있다. Sysmon은 윈도우 운영체제에서 높은 수준의 모니터링을 제공한다. 백그라운드에서 실행되며 모니터링 결과를 이벤트 로그에 기록한다. 이러한 유용한 기능을 제공하는 Sysmon은 많이 알려져 있으나 그 결과가 이벤트 로그에 저장되기 때문에 실시간으로 결과값을 보는 것이 기존 SIEM이나 다른 장비에 연동하기 어렵다면 모니터링이 불편하였다. 하지만, 오픈소스인 ELK Stack의 다양한 기능을 이용한다면 이점을 커버할 수 있다.

이번 포스팅에서는 Sysmon에 대하여 알아보고 생성블로그관리된 로그를 ELK Stack을 통해 모니터링 하는 방법에 대하여 알아보고자 한다.

Sysmon 설치

우선적으로 이번 프로젝트에 중심이 될 Sysmon을 설치한다. https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon에 설치한다.

다운 받은 Sysmon을 압축 해제하고 Command 창을 이용하여 설치한다. Sysmon 설치와 관련한 옵션은 “-h” 옵션을 통해 자세히 확인할 수 있다.

[그림 1] Sysmon64.exe -h

 

Sysmon을 더 유용하게 사용하기 위해서는 config 파일을 이용하여야 한다. 직접 설정하는 방법도 있으나 이미 github를 이용해 공개된 Sysmon config파일을 이용하는 방법을 추천한다. 부족한 부분은 제외하고 추가할 부분을 추가하여 설정이 가능하다.

설정 파일은 공개된 github(https://github.com/SwiftOnSecurity/sysmon-config)에서 다운로드 하였다.

설치 명령은 다음과 같다.

Sysmon64.exe -accepteula -i C:\Users\Administrator\Desktop\Sysmon\sysmonconfig-export.xml -l -n

[그림 2] Sysmon 설치

최초 설치에는 “-I” 옵션을 사용했으나 이후 설정파일에 변경이 있다면 “-c” 옵션으로 변경된 옵션을 적용할 수 있다.

설치가 끝나면 자동으로 Sysmon이 작동이 되는데 비스타 이후 버전은 Applications and Services Logs/Microsoft/Windows/Sysmon/Operational 경로에 Sysmon로그가 쌓이며 이전 버전은 System event 로그에 쌓이게 된다. 윈도우에서 기본으로 제공하는 이벤트 뷰어로 확인이 가능하다.

[그림 3] EventLog

Sysmon의 이벤트 로그는 다음과 같이 저장되며 의미를 가진다.

Event ID 설명
1 프로세스 생성
2 프로세스가 파일 생성시간을 변경
3 네트워크 연결
4 Sysmon 서비스 상태 변경
5 프로세스 종료
6 드라이버 로드
7 이미지 로드 (“-l” 옵션으로 활성화 필요)
8 다른 프로세스에서 스레드 생성
9 RawAccessRead 탐지 (프로세스가 “\\.\” 표기법 이용하여 드라이브 접근시)
10 특정 프로세스가 다른 프로세스 Access (ex. Mimikatz > lsass.exe)
11 파일 생성 (생성 및 덮어쓰기)
12 레지스트리 이벤트 (키 값 생성 및 삭제)
13 레지스트리 이벤트 (DWORD 및 QWORD 유형의 레지스트리 값 수정)
14 레지스트리 이벤트 (키 및 값 이름 변경)
15 FileCreateStreamHash (파일 다운로드와 관련된 Zone.identifier 확인)
17 PipeEvent (파이프 생성)
18 PipeEvent (파이프 연결)
19 WmiEventFilter 활동이 감지 됨 (악성코드 실행시 사용될 가능성 있음)
20 WmiEventConsumer 활동이 감지 됨
21 WmiEventConsumerToFilter 활동이 감지 됨
255 Sysmon 오류

[표 1] Sysmon Event ID

ELK + Beats

ELK란 Elasticsearch, Logstash, Kibana의 3가지 오픈소스를 부르는 말이다.

Elasticsarch : 분산 검색 엔진, 데이터 저장

Logstash : 입력 값 필터링

Kibana : 시각화 도구

Beats : 시스템 정보 및 파일 로그 전달 등의 기능

위에 4가지 도구를 이용하여 Sysmon 모니터링 도구를 만들고자 한다. 기본적으로 ELK를 설치하는 방법은 지난 포스팅에서 설명하였기 때문에 자세한 ELK 설치 방법에 대해서는 따로 언급하지 않고 설정과 관련된 부분을 다루려고 한다. 설치와 관련된 정보는 ELK 스택의 사이트(https://www.elastic.co)에서 얻을 수 있다.

전체적인 구성도는 Sysmon을 설치한 파일에 Winlogbeats를 설치하고 해당 데이터를 ELK가 설치된 서버로 전송하는 방식이다. 각각 Logstash는 5044포트로 데이터를 받아 Elasticsearch로 보내고 Kibana의 5601포트로 결과값을 확인 가능하다.

[그림 4] Sysmon + ELK 구성도

 Beats 설정

Beats는 경량 로그 수신기로 여러 종류가 있다. 이 중 Winlogbeats는 Eventlog를 전달해주는 역할을 한다. Sysmon을 전달하기 위해서 Sysmon이 설정된 시스템에 Winlogbeats를 설치하고 다음과 같이 설정 파일을 변경해준다. 설정 파일의 내용은 다음과 같다. (winlogbeat.yml)

[그림 5] Winlogbeat.yml

아래와 같은 명령어로 실행이 가능하며 ELK 사이트에서 서비스로 등록하는 방식을 참고하면 서비스로 등록하여 사용이 가능하다.

C:\Users\Administrator\Desktop\winlogbeat>.\winlogbeat.exe -c .\winlogbeat.yml -e

Logstash 설정

Beats로 전달 받은 데이터를 더욱 효율적으로 보기 위해 Logstash를 이용하여 각각의 값에 항목을 지정해 준다. Logstash의 필터링은 Logstash의 conf 파일을 수정하여 만들 수 있다.

Sysmon의 데이터 중에 의미있는 값을 선별하게 위해 conf 파일을 작성하였다. 하지만 이는 사용자의 설정에 따라 변경되어야하며 필터링으로 인해 더 다양한 이벤트를 탐지할 수 있다.

이벤트에 대한 conf파일을 만들기 위해서는 우선 입력되는 데이터에 대하여 확인하는 것이 중요하다.

입력되는 데이터는 다음과 같다.

[그림 6] Winlogbeat 입력값

입력되는 데이터 부분중 특히 message부분에서 의미있는 값을 찾아낼 수 있다. X-pack 설치후 활용이 가능한 Grok Debugger나 웹페이지 http://grokdebug.herokuapp.com/를 이용하여 Grok 표현식을 통해 message 부분에서 특정 부분을 추출해서 사용할 수 있다.

[그림 7] Grok Debugger – Xpack

input {

beats {

port => 5044

}

}

 

filter {

if ([event_data][hashes][altsha1]) {

mutate {

split => [“[event_data][hashes][altsha1]” , “=”]

add_field => { “[event_data][hashes][sha1]” => “%{[event_data][hashes][altsha1]][1]}” }

remove_field => [ “[event_data][hashes][altsha1]”]

}

}

if ([event_data][hashes][altmd5]) {

mutate {

split => [“[event_data][hashes][altmd5]” , “=”]

add_field => { “[event_data][hashes][md5]” => “%{[event_data][hashes][altmd5]][1]}” }

remove_field => [ “[event_data][hashes][altmd5]”]

}

}

if ([event_data][hashes][altsha256]) {

mutate {

split => [“[event_data][hashes][altsha256]” , “=”]

add_field => { “[event_data][hashes][sha256]” => “%{[event_data][hashes][altsha256]][1]}” }

remove_field => [ “[event_data][hashes][altsha256]”]

}

}

if ([event_data][hashes][altimphash]) {

mutate {

split => [“[event_data][hashes][altimphash]” , “=”]

add_field => { “[event_data][hashes][imphash]” => “%{[event_data][hashes][altimphash]][1]}” }

remove_field => [ “[event_data][hashes][altimphash]”]

}

}

if ([event_id] == 1) {

grok {

match => { “message” => “http://%{IP:[remote_ip]}/%{GREEDYDATA:[event_data][powershell_file]}'” }

}

}

}

 

output {

stdout { codec => rubydebug }

elasticsearch {

hosts => [“localhost:9200”]

index => “logstash-winlogs”

}

}

[그림 8] logstash – sysmon.conf (참조: http://www.ubersec.com/2017/12/14/sysmon-elk-monitoring-integration-and-apt34-tools/)

Kibana 설정

입력된 데이터를 시각화하는 Kibana에서는 Sysmon 로그를 이용하여 대시보드를 만들어 볼 수 있다. Kibana의 index-pattern은 Logstash에서 설정한 output의 index 부분으로 정의된다.

[그림 9] Kibana – Discover

이렇게 index된 데이터를 불러와서 Kibana Visualize 작업을 실시한 후 여러 개의 Visualize가 모여서 나만의 Dashboard를 만들 수 있다.

[그림 10] Kibana – Dashboard

X-pack에서 추가된 머신 러닝 기능과 담당자의 메일 등으로 Alert가 가능한 6.0 이상의 버전을 이용하면 더 효율적으로 사용이 가능하다.

[그림 11] Kibana -Xpack 이상 행위 탐지

결론

추가적으로 Windows의 감사정책 및 이벤트 로그를 변경하면 Sysmon에서 로깅하는 데이터 이외에도 의미 있는 데이터를 얻을 수가 있다. 이렇게 전달되는 데이터가 다양해지면 이를 ELK를 이용하여 더 많은 이상행위를 탐지할 수 있다.

이번 포스팅에서 소개한 Sysmon과 ELK가 백신이 함께 시스템을 방어한다면 탐지가 어려운 APT 공격에 충분한 대응 방안이 될 수 있다고 생각한다. 최소한의 비용으로 증가되는 위협에 대응해보자.

참조

https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon

https://github.com/SwiftOnSecurity/sysmon-config

https://cyberwardog.blogspot.kr/2017/03/building-sysmon-dashboard-with-elk-stack.html

http://www.ubersec.com/2017/12/14/sysmon-elk-monitoring-integration-and-apt34-tools/

ORACLE JOB 등록방법 (simple)

오라클 자체적으로 프로시저, 패키지, 등의 OBJECT 를 ORACLE JOB QUEUE에 등록후 스케쥴링 하여 사용할수 있습니다.

단, ORACLE PARAMETER 의 JOB_QUEUE_PROCESSES가 0보다 커야 JOB 스케쥴링이 동작한다는것에 유의하세요.

ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 10 ; –변경

# DBMS_JOB 패키지의 프로시저

DBMS_JOB.SUBMIT( );          : JOB 등록

DBMS_JOB.REMOVE( );        : 제거

DBMS_JOB.CHANGE( );        : 변경

DBMS_JOB.NEXT_DATE( );   : JOB의 다음 수행시간 변경

DBMS_JOB.INTERVAL( );       : JOB의 실행 CYCLE 지정

DBMS_JOB.WHAT( );              : JOB 수행 으로 등록된 OBJECT 를 변경

DBMS_JOB.RUN( );                : JOB을 수동으로 실행

BEGIN
DBMS_JOB.RUN(‘4’);  — JOB 조회 후 번호 기술
END;

 

# SUBMIT 프로시져를 이용한 JOB등록 예제

DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT (
JOB       => X
,WHAT      => ‘실행할 OBJECT’
,NEXT_DATE => TO_DATE(’17-11-2007 09:00:00′,’DD/MM/YYYY HH24:MI:SS’)
,INTERVAL  => ‘TRUNC(SYSDATE) + 1 + 9/24’
,NO_PARSE  => TRUE
);
SYS.DBMS_OUTPUT.PUT_LINE (‘JOB NUMBER IS:’|| TO_CHAR (X)) ;
END;

# INTERVAL을 세팅

1. 10분간격으로 실행

SYSDATE + 1/24/6

2. 현재 시간으로 부터 다음 날 현재 시간에 실행 (매일)

SYSDATE + 1    — 지금이 오후3시면 다음날 오후 3시 에 매일매일 실행

3. 매일 새벽 5시

TRUNC(SYSDATE) + 1 + 5 / 24

4. 매일 밤 10시

TRUNC(SYSDATE)  + 20 / 24

# JOB의 확인

SELECT * FROM USER_JOBS;

NEXT_DATE 을 통해 다음 실행 예정인 시각을 확인

# 자세한 사항은 아래를 참고

HTTP://WWW.PSOUG.ORG/REFERENCE/DBMS_JOB.HTML

Oracle 12c ORA-01017: invalid username/password

After I installed Oracle SE 12c on my server, some clients with 11Gr2 or 9i (OCI,Oledb,.net and ODBC drivers) started to show the following error:

ORA-01017: invalid username/password; logon denied

오라클 12c 설치 하면 기존에 사용하던 11g 프로그램을 이용하여 접속시 위와 같은 에러가 나올때가
있다 .

그 경우 아래와 같이 해 주면된다.

1) 아래와 같이 oracle 에 sqlnet.ora 파일을 수정한다.
sqlnet.ora
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8

2) password 버전을 확인 합니다.
select USERNAME,ACCOUNT_STATUS,PASSWORD_VERSIONS from dba_users;

USERNAME          ACCOUNT_STATUS    PASSWORD_VERSIONS
—————                       ————–                   —————–
dummyuser                         OPEN                         11G 12C

3) 기존 패스워드를 재생성 합니다.

You must be careful with quotes and doble quotes.
It’s recommended to reset the user password, using a admin credentials.

ALTER USER user_name IDENTIFIED BY new_password;

4)접속을 해본다.