Category: HowTo

가상 머신에 콘솔 접속하기

CentOS 6/7 혹은 RHEL 6/7 은 KVM 가상화를 지원 합니다. 가상화를 위한 네트워크를 설정하고 가상화 패키지를 설치하면 이제 가상 머신, 게스트 OS 를 설치할 수 있게 됩니다. 그런데, 맨 처음에 게스트 OS 를 설치하고 나면 더구나 DHCP 로 IP를 할당 받는다면 설치가 끝나고 나서 할당된 IP를 모르기 때문에 바로 접속을 할 수가 없습니다.

그래서 virt-manager 를 이용해서 게시트OS 화면에 접속하고 로그인을 하고 IP를 확인한 후에 SSH를 이용해서 외부에서 접속이 가능해 집니다. 하지만 이것말고 호스트 OS 터미널에서 게스트 OS로 virsh 명령어를 이용해서 접속할 수 있는데 이것이 가상 머신에 콘솔 접속하기 입니다.

virsh 명령어

virsh 명령어는 호스트OS에서 게스트OS(가상머신)을 관리하기 위한 명령어 입니다.

가상머신 이름이 나오는데, 이를 이용해서 다음과 같이 직접 게스트OS에 접속이 가능합니다.

하지만 게스트OS에 접속이 안됩니다.

게스트OS Grub 설정 변경

이를위해서 게스트OS에 Grub 에 옵션으로 다음과 같이 ‘console=ttyS0’ 을 추가해 줍니다.

하지만 이렇게 하나하나 다 하기보다는 다음과같은 명령어를 이용하면 편합니다.

CentOS6/RHEL6 의 경우 – grubby

grubby 는 각종 옵션들을 쉽게 설정할 수 있게 해줍니다. 위의 경우에 다음과 같이 할 수 있습니다.

CentOS6/RHEL6 에는 이렇게만 하고 서버를 재시작해줍니다.

CentOS7/RHEL7 의 경우 – /etc/default/grub 편집

CentOS7/RHEL7 의 경우에는 grub2 를 채택하고 있고 공통적인 옵션들은 ‘/etc/default/grub’ 파일에 있습니다. 이 파일을 편집해 줍니다.

이렇게 하고 grub2 를 다음과 같이 갱신해 줍니다.

위와같이 하고 난후에 가상머신을 재시작해줍니다.

접속 테스트

가상머신을 재시작한 후에 호스트OS에서 다음과 같이 접속을 해봅니다.

명령어를 입력해주고 Enter 를 두번 쳐주면 접속 로그인이 나옵니다. Console 접속을 해제하기 위해서는 Ctl+] 를 입력하시면 됩니다.

 

Nginx 설정.

이 문서는 Nginx  설정에 대한 문서 입니다. 계속적으로 업데이트가 됩니다.

요청 메소드 제한

요청 메소드는 GET, HEAD, POST, PUT, DELETE 등이 있다. 문제는 대부분 웹 서비스는 GET, HEAD, POST 만 필요로한다는 것이다. Nginx 에서 이를 다음과 같이 제한 할 수 있다.

GZIP 설정

 

DNS amplification DDos attacks (DNS 증폭 DDos 공격)

최근에 관리하는 서버에 트래픽이 몰리는 현상이 발생했다. 웹 서비스 트래픽도 아니기에 뭔가 싶어 봤더니 53 포트를 통한 input 트래픽이였다. 그래서 ngrep 으로 53 포트를 모니터링 하니 대략 다음과 같이 나왔다.

뭔가 자꾸 DNS 서버에 쿼리(Query)를 보내고 있었고 이로 인해서 트래픽이 발생하는게 분명했다.

DNS amplification DDos attacks (DNS 증폭 DDos 공격)

‘DNS amplification DDos Attacks’ 는 DNS 증폭 DDos 공격으로 불리운다. 왜 ‘증폭’ 일까?

DDos 는 대량의 트래픽이 필요하다. 초당 수십 Gbps 를 유발시켜야 하는데 이렇게 할려면 많은 장비가 필요하다. 그러다보니 DDos 공격을 개인이 한다는 건 무리가 있다. 그런데, DNS 서버는 이런 많은 장비 없이도 대량의 트래픽을 유발시킬 수 있는 구조적인 면을 안고 있다.

DNS 는 인터넷을 위해서는 반드시 존재해야만 하는 서버다. 인터넷 전화번호부 라고도 불리우는 서버로 인간의 주로 사용하는 도메인을 컴퓨터가 알아볼수 있는 IP 주소로 변환한다. 브라우저 주소창에 도메인을 입력하면 DNS 서버에 그 도메인의 IP 주소를 질의(Query) 한 후에 받은 IP를 가지고 실제 서버에 접속하는 구조다.

이렇게 DNS 는 질의(Query)를 받아 응답한다. 그런데, DNS 에 보낼 수 있는 질의(Query)는 다양하며 그중에서 재귀적 질의(Recursive Query) 가 문제가 된다. 재귀적 쿼리는 DNS 서버가 보유한 도메인 리스트에 질의한 내용이 없을 경우 이를 다른 DNS 서버에 질의하는 것을 말한다.

예를들어 DNS-A 이라는 DNS 서버에 naver.com 을 질의했다면 DNS-A 서버는 먼저 자신의 도메인 리스트에 naver.com 이 있는지 찾게 된다. 없다면 최상의 DNS 서버인 ROOT-DNS 서버에 DNS-A 서버가 naver.com 서버의 IP가 무엇인지 질의하게 된다. ROOT-DNS 서버는 naver.com 주소의 TLD(Top Level Domain) 인 .com DNS 서버에 물어보라고 DNS-A 서버에 알려주고 다시 DNS-A 서버는 .com TLD 서버에 질의한다. .com TLD 서버는 naver.com 네임서버에게 물어보라고 응답하고 DNS-A 서버는 드디어 naver.com 을 가진 DNS 서버에 IP를 요청하고 이를 받아서 클라이언트에게 응답하는 것으로 임무는 종료 된다.

  • OS에 설정된 DNS-A 서버에 naver.com 의 IP를 요청한다.
  • DNS-A 서버는 자신의 도메인 리스트나 도메인 캐쉬에서 naver.com IP를 찾는다. 있다면 응답하고 끝나게되고 없다면 다음으로 진행.
  • DNS-A 서버에 naver.com 이 없음을 알게된 서버는 최상의 DNS 서버은 ROOT-DNS 에 naver.com IP를 질의한다.
  • ROOT-DNS 는 naver.com 의 TLD (Top Level Domain) 인 .com DNS 에 물어보라고 DNS-A 에게 알려준다.
  • .com DNS 서버는 naver.com 도메인의 DNS 서버에게 물어보라고 DNS-A 에게 알려준다.
  • 마침내 DNS-A 서버는 naver.com 도메인의 DNS 서버에 IP가 뭐냐고 질의한다.

여기에 질의 내용을 ‘ANY’ 로 할 경우에는 응답하는 양이 많아진다. 도메인의 DNS 구성에는 MX, A, TXT, CNAME 등 다양하다. 질의할때에는 어떤 타입을 원하는지를 정할 수 있게 되는데, ANY 타입의 질의는 도메인이 가지고 있는 모든 정보를 원하게 된다.

결국 재귀적 질의와 ANY 타입의 질의를 결합해 초당 수백건의 도메인 질의를 보내게 되면 DNS 서버는 이 질의에 응하게되고 수십Gbps 의 응답 트래픽을 발생시키게 된다. 이것이 바로 ‘DNS 증폭 DDos 공격’ 이다.

이 공격은 대부분 DNS 의 잘못된 설정 탓이다. BIND 9 의 경우에는 재귀적 질의를 맞음으로써 간단하게 해결할 수 있다.

BIND 9 의 기본 설정은 ‘recursion yes’ 임으로 이를 바꿈으써 ‘DNS 증폭 DDos 공격’을 막을 수 있다. 이 공격을 막았을 경우 로그는 다음과 같이 쌓인다.

 

gitlab 패스워드 리셋하기

gitlab 패스워드 리셋하기

Gitlab 을 사용하다가 갑자기 패스워드를 잊어버리는 경우가 생길 수 있습니다. 이럴때 보통 Web 에서 ‘Fogot your password’ 링크를 클릭하고 리셋될 패스워드를 가입할때 적어놓은 E-mail 로 발송을 해줍니다. 그런데, E-mail 주소가 없는 거라면 패스워드를 리셋할 수가 없어서 로그인을 못하게 됩니다.

이럴때는 Gitlab 서버에 터미널로 로그인을 해서 gitlab-rails console을 실행하고 패스워드를 바꿀 수 있습니다. 먼저 gitlab-rails console로 접속을 합니다.

여기서 만일 E-mail 주소를 정확하게 알고 있다면 다음과 같이 user 객체를 지정할 수 있습니다.

그런데 위와같이 ‘nil’ 로 나오면 없는 사용자라는 거죠. 그럼 다음은 id 로 검색을 합니다. id 는 내부 데이터베이스에 저장될때에  사용되어진 primary key 인듯 합니다. 보통 사용자가 1명이라면 이 방법이 통하지만 수십명이면 안되겠죠.. (전 집에서 개인적으로 사용하기 때문에 사용자가 1명인 경우입니다. )

뭔가 나오네요… 그런데 이마저도 모르겠다!! 그러면 사용자 로그인 아이디로 검색을 해봅니다.

뭔가 나왔군요. 그러면 user 객체가 생성되어진 겁니다.

패스워드는 다음과 같이 바꾸면 됩니다.

그리고 바로 Web 에서 변경된 패스워드로 로그인이 가능합니다.

Suspend 된 게스트 시작 않될때 해결 방법.

Suspend 는 보통 게스트를 Paused 상태로 만드는 것을 말한다. 이는 동작상태를 하드디스크에 그대로 저장하고 끝내는 것을 말하며 이를 재시작하는 것을 Resume 이라고 한다. 명령어로는 그냥 start 명령어를 쓰지만 Suspend 에서는 부팅이 아닌 저장하고 끝난 부분을 풀고 바로 시작되는 것이 다르다.

그런데, Suspend 한 이미지를 시작하려고 할 때에 다음과 같이 오류가 나왔다.

아무리 Resume 을 할려고 하더라도 위와 같은 오류로 시작도 않되었다. 이럴때는 다음과 같이 해서 부티을 시도하는 것이 좋다.

이는 앞에서도 말했듯이 Supsend 될때에 저장된 이미지를 삭제하도록 한다. 앞에서 오류는 바로 이 저장된 이미지를 풀고 Resume 을 하려고 하는 것인데, 이 이미지가 잘못되었것이다. 이럴때는 어쩔수 없이 부팅을 해야하게이 이를 삭제하고 시작하면된다.

ELK 구축하기 1 – Logstash

ELK 는 ElasticSearch, Logstash, Kibana 를 말하며 보통 이 시스템은 실시간 로그분석 시스템으로 불리웁니다. Logstash 는 로그를 실시간으로 전송하고 ElasticSearch 는 전송된 로그를 검색 인덱스를 만들어 보관하며 Kibana 는 ElasticSearch 의 분석한 자료를 시각화해줍니다.

이를 이용하면 시스템 자체 뿐만 아니라 각종 애플리케이션의 로그들을 분석하고 시각화된 통계자료를 자동으로 얻을 수 있습니다.

첫번째로 Logstash 를 설치해보도록 하겠습니다.

설치

Logstash 는 Java 7 이상이 필요합니다. Java 7 을 설치해야 합니다. 이것이 없으면 동작이 안됩니다.

Logstash 홈페이지에서 다운로드 받아 설치할 수 있습니다. tar.gz 도 있고 우분투, 레드햇 패키지도 있어 자신에게 필요한 것을 받아 설치하면 됩니다.

 

기본개념

Logstash 의 기본 개념을 잠깐 살펴보겠습니다.

마치 쉘(Shell)의 파이프라인(pipeline)처럼 동작합니다. 입력을 받아서 출력을 해주는 구조 입니다. 그리고 입력 받은 내용을 필터링을 하고 출력할 수도 있습니다.

Logstash 에서 Input, Filter, Output 이 핵심이며 다양한 Input, Filter, Output 에 대응하기 위해서 각각 플러그인을 가지고 있습니다. 예를들어 다양한 입력을 받아야 하는 경우에 운영자가 Input 자체를 구성할 수 있지만 누군가 만들어놓은 플러그인 설치하면 끝나게 됩니다.

basic_logstash_pipeline

결국 Logstash 를 운영은 수집하고자 하는 로그에 대해서 Input, Filter, Output 어떻게 만들고 구성할것인가가 핵심이 됩니다. 그래서 설정파일의 형식은 다음과 같습니다.

 

사용법

명령행으로 사용할 수 있습니다.

‘-e’ 옵션은 명령행에서 설정파일을 작성할 수 있도록 해줍니다. 설정 내용을 보면 input 부분에 ‘stdin{}’ 으로 표준입력을 받겠다는 것이고 output 에 ‘stdout{}’ 으로 표준출력으로 결과를 내보내겠다는 뜻입니다.

이제 아파치 로그 파일을 Logstash 설정파일을 만들어 분석해보도록 하겠습니다. 먼저 input 부분을 정의해 줘야 합니다. 예를들면 다음과 같습니다.

‘input{}’ 에는 어떤 형태의 입력을 받을 것인가를 정의하는데 이것을 플러그인(Plugin)이라고 합니다. 그래서 ‘input 플러그인이 무엇이냐?’하는 질문이 가능합니다. 여기서는 ‘file’ 이되며 보다 자세한 사항은 ‘Input plugins‘ 페이지를 참고하시면 됩니다. 그에 따른 세부사항을 설정하도록 되어 있습니다. 위 예제에서는 file 로부터 받을 것이기에 형태를 file 로 했고 세부사항으로 파일의 경로와 ‘start_position’ 을 정의했습니다. file 형태로 입력을 받을 경우에 기본값은 Unix 시스템의 ‘tail -f’ 와 같이 실시간으로 파일에 새롭게 써지는 로그들을 읽도록 되어 있는데 이를 바꾸고자 한다면 ‘start_position’을 이용하면 되고 위 예제에서는 파일의 처음부터 읽도록 바꾸었습니다.

다음으로 filter 을 정의해야 합니다. 아파치 로그를 파싱하기 위한 작업입니다. 역시나 filter plugin 들이 아주 많은데, 여기서는 기본으로 가지고 있는 grok 을 사용해서 다음과 같이 로그 파싱을 정의해줍니다.

아파치로그를 커스터마이징했다면 위의 예제와는 다르게 정의해야 합니다. 위 예제는 아파치로그가 “COMBINED” 로그로 설정되어 있어서 이 형태를 파싱하겠다 것입니다.

Output plugin 은 화면으로 출력을 하기위해 다음과 같이 stdout 을 사용합니다.

이것을 하나의 파일에 저장한 후에 다음과 같이 실행해 줍니다.

위와같이 원하는 결과가 화면에 나옵니다.

Python JSON Tool 을 이용한 Readable한 JSON 출력하기.

Python 을 설치하면 JSON Tool 이 포함됩니다. Python JSON Tool 을 이용한  Readable한 JSON 출력이 가능합니다. 즉 쉘 상에서 JSON 포맷을 보기 좋게 볼수 있습니다. 보통은 다음과 같이 출력되서 쉽게 알아보기 힘듭니다.

이를 보기 좋게 출력하는 방법은 다음과 같습니다.

 

쓰레드 묶음으로 처리하기..

처리해야할 태스크가 100여개 있는데, 이것을 3개씩 처리하고 싶은 경우가 있습니다. 이럴때는 쓰레드 생성 함수를 루핑 돌리면서 처리해주면 됩니다.

아래 소스는 Practical threaded programming with Python 를 기반으로 작성되었습니다.

 

패키지내에 파일 보기

패키지를 설치하기전에 그 패키지에 어떤 파일들이 들어 있는지를 알고 싶을때가 있습니다. Ubuntu, CentOS 에서 명령어로 모두 가능합니다.

Ubuntu 의 경우

Ubuntu 에서는 apt-file 명령어로 간단하게 가능합니다.

설치

설치는 다음과 같이 ‘apt-get’ 명령어로 간단하게 됩니다.

File 리스트 업데이트

파일 내역들을 업데이트를 다음과 같이 해줍니다.

패키지에 File 리스트 보기

다음과 같이 간단하게 살펴볼 수 있습니다.

CentOS 의 경우

CentOS 에는 repoquery  명령어로 가능합니다. 이는 yum-utils 를 설치하면 있습니다.

설치

yum 명령어로 yum-utils 설치 가능합니다.

파일 보기

파일 보기는 다음의 명령어로 확인 가능합니다.