카테고리 Archives: Server engineering

php 에서 dbcon 작성 할때 localhost가 안먹을때.

서버에 APM 이 정상 설치가 되어 있으나

php 로 dbcon 을 할때 127.0.0.1은 먹고 localhost 로는 접속이 불가능할때가 있다.

 

먼저 mysql로 로그인을 하여 소켓 위치를 파악하자.

 

php.ini 파일에서 mysql.default_socket 을 일치시켜준다.

 

그다음 아파치나 php-fpm을 재시작 ‘ㅅ’a

CentOS5 에서 let’s encrypt 설치

일단 설치 법은 크게 다르지는 않지만 몇가지 막히는 부분이 있다.

 

이 다음 git을 통해 letsencrypt를 가져오는 명령어가 그냥 실행하면 되지 않는다.
아마도 git 에서 제공되는 SSL에서 지원하는 suite 가 centos 에 없거나 신뢰할수 있는 CA로 등록되어 있지 않는듯 하다. 때문에 GIT_SSL_NO_VERIFY=true를 하고 진행한다.

일단 설치는 잘 완료되 되었다.

 

이후 발급 시도시 SSL_set_tlsext_host_name 관련 에러가 날것이다.~]# cd /usr/local/letsencrypt

사유는 openssl 버전이 너무 낮기 때문에 발생하는것으로 판단된다.

 

때문에 별도의 수정이 좀 필요하다.

에러 해결은 github 의 antmd님의 댓글에서 발췌 했습니다. ‘ㅅ’a

를 한뒤에 아래 두파일의 의 1239번째줄과 296번째줄을 주석처리한다 ( # 으로.. )
~/.local/share/letsencrypt/lib/python2.7/site-packages/OpenSSL/SSL.py ( 1239줄 )

~/.local/share/letsencrypt/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.py ( 296줄 )

 

그다음 다시 발급 시도를 하면 정상 발급이 된다.

 

 

ps. ~/.local의 파일 수정이 잘 안되는 분, 혹은 파일이 없는 경우 아래와 같이 수정된 소스를 다운받아 실행합니다.

 

Server Name Indication.

아파치 2.2.12이상 / 아파치 2.4.8 이상 버전에서는 Server Name Indication 를 지원한다.
Server Name Indication은 TLS를 이용한 핸드쉐이크의 확장 기능이라고 보면 되겠다.

몇몇 브라우져 및 기기의 접속 제한이 있지만 이를 무시할 수 있을경우 하나의 서버에서
여러사이트의 SSL(https)를 단일 443 포트로 연결할 수 있다.

 

SNI를 설정할때는 먼저 서버명의 443포트를 먼저 선언해야 고객들의 혼란을 방지 할수 있다.
아파치의 경우 커넥션이 웹서버에 도달했을때 매칭이 되는 가상호스트가 없을경우 최상위에
선언되 버츄얼호스트로 연결한다.( nginx 는 반대로 마지막에 선언된 버츄얼호스트로 작동한다 )

서버 버전이 CentOS 6.5 미만에서는 ca-certificates / nss 업데이트가 필요할 수 있다.

아파치 2.4의 경우 버전을 만족한다면 단순히 443포트로 선언된 여러 가상호스트를 추가하는것만으로 세팅이 완료가 된다.

 

아파치 2.2 버전은 NameVirtualHost 를 선언해야 한다.

위와 같은 세팅만으로 여러 사이트가 443 기본 포트로 ssl 이용이 가능하다.
단  아래 조합은 브라우져에서 SNI 접속 기능이 없기 때문에 접속이 불가능 하다.
Windows XP – 인터넷 익스플로어(모든버전), 사파리
Android 2.3.7(진저브레드)을 포함한 이전 버전
BlackBerry 7.1을 포함한 이전 버전
WindowsMobile 6.5을 포함한 이전 버전
https://en.wikipedia.org/wiki/Server_Name_Indication

 

SNI 는 nginx 0.8.21 이상 / IIS 8.0 이상 역시 지원 한다.

Let’s encrypt 설치 및 운용(CentOS)

Mozila 재단에서 진행하는 무료SSL 인증서 발급 프로젝트 이다. ( https://letsencrypt.org )
90일 단위로 갱신을 해야 하는 단점이 있지만 이부분은 cron 등록으로 극복이 가능 하다.
무엇보다 무료라는 강점이 있기 때문에 많이 사용될 가능성이 크다.

 

SSL을 도입할경우 스니핑등을 예방할수 있으며 국내법적으로는 회원의 개인정보를 수집하는 사이트의 경우SSL을 도입해야 한다.

여기서 설명하는 내용은 CentOS 6.x 와 이미 APM이 구축된 서버에서 진행 하였습니다.


certbot-auto 의  설치 방법은 더이상 유효 하지 않습니다. – 아래 글을 확인해 주세요 ‘ㅅ’a

Let’s encrypt 사용 방법 변경


1. 설치 ( ISU 레포지트리 배포처 https://ius.io/GettingStarted )

설치는 그냥 필수 라이브러리를 설치하고 git을 통해 실행 스크립트를 가져오는 수준이다.

 

2. 실행(일반 사용법)

웹서버 운용시 일반적으로 gcc 에 보안설정을 해서 제공을 하게 되는데 일반적으로 퍼미션 700 과
chattr +i 를 해놓는다.
gcc , c++ 명령어에 보안설정을 하지 않았다면 2번째줄만 실행하면 되겠다.

 

 

3. 단축 명령어(인증서 발급)

4~5번재줄이 수정해야 하는 부분 이다.
-d 도메인  –email 이메일주소  –webroot w /경로/ 를 자신의 서버에 맞게 수정하여 실행한다.
일반적으로 -d enteroa.kr -d www.enteroa.kr -d wp.enteroa.kr과 같이 명령해야 한다.
www.도메인.com 을 빼먹는 짓을 하지 말자 ‘ㅅ’a

 

4. 아파치 설정.

SSLProtocol, SSLCipherSuite, SSLHonorCipherOrder 설정은 그냥 같이 올렸다.
https://www.ssllabs.com/ssltest 에서 테스트를 할경우 A+를 받을 수 있는 설정임.
20160314_PicPick_094231

설정 완료 후 브라우져를 통한 사이트 접속을 해서 https 가 적용되었는지 확인한다.

20160312_PicPick_154707녹색 열쇠가 뜨지 않고 아래와 같이 일부가 안전하지 않다고 뜬다면.
기존에 구성된 홈페이지의 소스상 https 가 아닌 http 선언이 있기 때문이다.(대부분 이미지 혹은 외부링크)
20160315_PicPick_160433
아래처럼 이걸 소스에서 찾아서 일일이 수정해주는 방법이 있겠다 =3=a

 

 

5. 갱신

gcc 와 c++ 명령어 보안설정 때문에 스크립트를 운용한다.
일반적으로는 /usr/local/letsencrypt/letsencrypt-auto renew –quite 으로도 충분.
자체적으로 만료일이 도래하지 않은 도메인은 갱신을 건너뛰기 때문에 매일 돌리면 된다.

 

6. 이용 제한( rate limit )
아무래도 무료SSL의 무분별한 사용을 막기 위한 설정이라고 보면 되겠다.

  1.  1개의 IP 에서 3시간동안 10개의 도메인을 허용한다.
  2.  7일 동안 1개의 도메인에서 5개의 도메인레코드 선언을 허용합니다.
    (enteroa.kr / www.enteroa.kr / mail.enteroa.kr / blog.enteroa.kr / etc… )

이 rate limit 는 발급받은 SSL 을 revoke(취소) 하거나 /etc/letsencrypt/ 에 생성된 항목을 삭제하더라도 반환되지 않습니다.

 

7. 인증서에 도메인 추가.
예를 들어 wp.enteroa.kr 만 등록한 도메인이 있을경우
인증서등록을 기존 도메인명을 처음부분에 선언하여 레코드(DNS)를 추가할 수 있다.

위 명령어로 진행시 기존 인증서에 도메인을 추가(EXPAND)할껀지 물어보는데 enter를 눌러서 진행하면 된다.

 

자세한 사용법(물론영어)은  http://letsencrypt.readthedocs.org/en/latest/using.html

CVE-2016-0800 취약점 – DROWN, CVE-2016-0702 취약점 – CacheBleed

SSL 취약점을 이용한 신종 공격 방식인 DROWN, CacheBleed 취약점이 발견 되었습니다.

 

□ 개요

o 3월 1일(현지시간) 오픈SSL은 SSLv2 규격(Protocol)에 대한 긴급 업데이트 발표[1]

o SSL 취약점을 이용한 신종 공격 방식인 DROWN, CacheBleed에 대한 보안 업데이트 등

– DROWN(Decrypting RSA with Obsolete and Weakened eNcryption)

– CacheBleed: 인텔 프로세서의 Cache-bank 충돌로 인한 정보 노출을 이용한 부채널 공격

 

□ 영향 받는 사용자

– OpenSSL 1.0.2 사용자: 1.0.2g로 업데이트
– OpenSSL 1.0.1 사용자: 1.0.1s로 업데이트

 

□ 업데이트 내용

o SSLv2 프로토콜 비활성화 기본 설정 및 SSLv2 EXPORT 암호화 제거 등

 

□ 취약점 내용 및 권고 사항

o DROWN: 낡고 취약한 암호화를 통한 RSA 복호화

– RSA(Rivest Shamir Adleman): 공개키 암호화 알고리즘의 하나

CVEs 심각도 내용 비고
CVE-2016-0800 높음 SSLv2를 이용한 TLS에 대한 프로토콜 간 공격 DROWN
CVE-2016-0705 낮음 DFB, 발생 빈도 낮음
CVE-2016-0798 낮음 SRP 데이터베이스에서의 메모리 누수
CVE-2016-0797 낮음 널 포인터 역참조 및 힙 커럽션
CVE-2016-0799 낮음 고정 메모리 이슈
CVE-2016-0702 낮음 부채널 공격 CacheBleed
CVE-2016-0703 높음 분할 정복 알고리즘
CVE-2016-0704 보통 Bleichenbacher 공격

 

□ 용어 설명

o DFB(Double-Free Bug): 힙 오버플로우에 기반을 둔 공격으로, 원하는 위치의 메모리를 사용하기 위한 방법

o 널 포인터 역참조(Null Pointer Dereference): 널 포인터에 임의의 값을 대입하여 발생하는 에러

o 힙 커럽션(Heap Corruption): 동적 할당한 크기보다 더 큰 영역에 접근함으로써 발생하는 에러

o 부채널 공격(Side Channel Attack): 알고리즘의 약점을 찾거나 무차별 공격을 하는 대신 암호 체계의 물리적인 구현 과정의 정보를 기반으로 하는 공격 방법

o 분할 정복 알고리즘(Divide-and-conquer): 그대로 해결할 수 없는 문제를 작은 문제로 분할하여 문제를 해결하는 방법

o Bleichenbacher 공격: RSA 암호화 메시지 내용을 점차적으로 노출하기 위한 공격

 

□ 문의사항

o 한국인터넷진흥원 인터넷침해대응센터: 국번 없이 ☏118

 

[참고사이트]

[1] https://www.openssl.org/news/secadv/20160301.txt

=====================================================================

openssl 의 취약점이 발생했다.

해결 방법은 openssl 1.0.1 사용자의 경우 1.0.1s 으로 업데이트.

1.0.2 버전 사용자는 1.0.2g 으로 업데이트를 하면 된다.

다만 아직 업데이트 패치가 나오지 않았기 때문에 아래와 같이 httpd.conf 혹은 extra/httpd-ssl.conf 에 설정하여 DROWN 공격을 막을 수 있다.

주의할것은 이는 SMTP , POP , IMAP 등과 같이 SSL을 적용할수 있는 모든 분야에 발생할 수 있기 때문에

위와 같은 임시조치를 하였더라도 업데이트가 나올경우 업데이트를 실시해야 한다.

업데이트 명령어는 아래와 같으며 실행시 openssl, openssl-devel 이 업데이트 된다.

 

아래는 openssl 1.0.2g 를 소스 컴파일로 업그레이드 하는 방법이다.

기존 openssl 이 깔려 있는 상태에서 openssl 을 설치한 경우
–with-ssl=/usr/local/openssl 옵션을 추가하여apache 재컴파일을 해야 한다.

 

아울러 php.ini 의 아래 항목을 찾아 수정 해야 한다.

아니면 아래와 같이 심볼링 링크를 생성한다.