태그 Archives: HSTS

MITM Attack (Man In The Middle attack)

SSL을 운용을 하면 서버 및 클라이언트 간의 통신을 암호화 한다.

다만 암호화 전송을 하는 값을 가로 채서 암호환 된 값을 해석없이 그대로 재 전송 하여 이용할수 있는 해킹 기법을 막기 위해
홈페이지에 HTTP Strict Transport Security / HTTP Public Key Pinning 을 선언해야 한다.
https://ko.wikipedia.org/wiki/중간자_공격 에 대략적인 공격 방식에 대한 설명이 있다.

예시를 들어서 설명을 한다면..

  1. 공격자가 A은행 에서 B은행으로 돈을 보낸다.
  2. 이때 공격자는 A은행에서 B은행으로 전송하는 데이터를 스니핑한다.
  3. 공격자는 암호화된 데이터를 해석하지 않은채로 http 를 이용하여 B은행으로 재 전송을 한다.
  4. HSTS, HPKP 선언이없을경우  B은행의 서버는 정상전송값과 공격자 신호를 구분 없이 계좌에 돈이 쌓인다.
  5. 공격자는 돈을 인출하여 유유히 사라진다.

 

A. HSTS (HTTP Strict Transport Security)

HSTS 선언을 하는 경우 사이트는 HTTPS 로 강제 고정이 되기 때문에 외부 HTTP 를 연동하여 서비스 되는 부분이 있을경우
해당 연결이 끊어질 수 있다. 기본적으로 forced HTTPS 가 적용된 사이트에서는 HTTP 컨텐츠를 불러올 수 없다.
아울러 인증서가 만료되는경우 이 HSTS설정 때문에 접속이 아예 불가능할 수 있다.

HSTS 는 몇번 언급을 한적이 있는데 Header SET 을 통해 선언 하며 forced HTTPS 가 적용된 사이트는 속도상 이점이 생긴다. – 선언된 Header 에 의해서 접속한 도메인은 HTTPS 통신만 사용한다는 선언이다.

.htaccess 혹은 웹서버의 가상호스트 에 선언하면 된다.

 

B. HPKP (HTTP Public Key Pinning)

HPKP는 인증서의 pin을 공개함으로서 통신에 사용된 인증서가 pin과 비교함으로서 위조된 인증서를 구분할 수 있다.
즉 선언을 할때 pin 코드는 인증서에서 추출해야 함으로 인증서가 교체되는 경우 pin 역시 교체를 해야한다.

첫번째 pin-sha256 의 경우 HTTPS 통신에 사용된 인증서의 pin 코드 이다.
두번째 pin-sha256는 서버에서 생성한 csr을 가지고 생성하는 코드 이며 백업 pin 코드 이다.

인증서(crt파일) 에서 pin 을 확인하는 방법이다.

CSR파일에서 pin 을 확인 하는 방법이다. (백업키 생성을 위해 쓴다.)

 

Let’s encrypt 를 이용했을때 약 2개월 단위로 인증서가 교체가 된다…. 즉 HPKP pin 역시 2개월 단위로 변경…을 해야 한다.
물론 백업키는 변경할 필요가 없겠지만…

이건 아무래도 귀찬기 때문에 스크립트 만들어야 겠다 ‘ㅅ’a

사이트 속도 빠르게 하기

이거슨.. 굳이 wordpress 뿐만이 아니라 모든 사이트 공통 사항이 될 수 있다.

 

A. 1단계 사이트 개발자의 영역이다.

  1. 사이트 속도는 외부 URL을 최대한 제거 해야 빨라진다.
  2. 웹폰트 등도 외부 URL이기 때문에 최대한 제거하는것이 좋다.
  3. js 및 css 를 minify 를 한다.
  • js, css 를 작성하기 좋은 형태가 아닌 최대한 압축한 형태로 바꾸는 것이다.
    또한 브라우어에서 표현 가능한 DPI를 넘어서는 그림파일을 브라우져에서 표현 가능한 정도의 DPI로 낮추어 최적화 하는것이다. ( 일반적으로 72DPI 레티나 대응은 144DPI가 일반적이다. )
    쉬운 길은 Google PageSpeed Insights에서 사이트 속도 측정을 한번 한 뒤에.
    측정결과 아래 부분에 있는 “이 페이지에 최적화된 이미지, 자바스크립트, CSS 리소스를 다운로드하세요.” 에서
    최적화된(minify 및 이미지 용량 최적화) 파일을 다운받아 사이트에 적용하는 것이다.

 

B. 2단계 서버 관리자의 영역이다.

  1. 웹서버에서 memory 기반 캐싱 서비스를 도입한다.
  2. 웹서버 에서 DEFLATE(gzip) 전송 설정을 한다.
  3. 웹서버 에서 expires 설정을 한다.
  • 웹서버의 성능을 향상 시키는 방법으로 memory 계열의 캐쉬를 사용하는것이 좋다.
    이것은 서버의 IO 를 낮추어 주기 때문에 DISK 로드 에버리지가 줄어든다.
    컴퓨터 하드웨어를 만지고 있다면 알겠지만 disk(디스크) 보다 memory(메모리) 가 20배 이상 빠르다.
    또한 memory(메모리)는 cpu(중앙처리장치)보다 20배 이상 느리다.때문에 메모리 기반의 캐시 프로그램을 도입하도록 고려한다.
    php 익스텐션 방식이 훌륭하다.(추천순 opcache, xcache, APC)
    아파치 DSO 인 mod_deflate, mod_expires 를 이용하여 서빙되는 웹사이트의 데이터를 gzip 압축 전송하고 전송되는 파일의 브라우져캐시 기간을 설정한다.

opcache 는 php 5.5 이상에 내장되어 배포 되었으며 php 5.5 이상일 경우 php.ini 에 설정을 추가하는것만으로 동작한다.

xcache 는 링크 참조.

mod_deflate 및 mod_expires (httpd.conf 삽입)

제로보드 xe의 경우 php 소스내에서 자체적으로 gzip 전송을 을 구현했기 때문에 DEFLATE 안해도 됨.

 

추가적으로 아래와 같은 작업을 통해 사이트 속도를 좀더 가속화 할 수 있다.
다만 일반적으로 현재 한국내에서의 여건상 적용하는것을 추천하지는 않는다.
(한국내 대부분의 웹사이트의 https 사용률이 낮고 인증서관리가 어렵다.)

  1. force https 를 적용하고 Strict-Transport-Security 를 적용한다.
  2. https 를 이용하여 HTTP/2를 활성화 한다.

다만 이부분은 force https 를 적용 하는것부터가 문제가 된다.
외부url 에서 이미지등을 가져오는 경우에도 그 url이 https가 되어야 한다.
일반적으로 img 태그의 src 가 http://aaaa.com/image.jpg 일경우 //aaaa.com/image.jpg 이런식으로 바꾸면 된다.
1차문제는 이게 기존사이트를 바꾸려면 꽤 심한 하드코딩 노가다 이고… 2번째 문제는 aaaa.com 이 https 서비스가 되고 있느냐가 되겠다 = =aa..

 

이산을 넘어서 Strict-Transport-Security 를 적용하게 되면 https가 만료되면 사이트가 뜨지 않는다.
httpd.conf 및 .htaccess 에서 선언할 수 있으며 코드는 아래와 같다

주의: https를 적용하고 인증서 관리를 철저히 하지 않으면 사이트 안열림(설정상 최대 180일)

apache 버전이 2.4.17 (2015년 11월 배포됨) 버전 이상일 경우 일련의 과정을 통해 HTTP/2 서비스를 할 수 있다.
이건 약간 내용이 길고 난해 함으로 추후 별도 포스팅을 할 예정 이다. (지금 써놓은 포스팅 만큼 김 = =a)

그래서 결론은 GTmatrix 에서의 점수놀이 🙂
20160416_PicPick_152917애드센스와 젯팩 때문에 더이상 점수 상승이 어렵다 = =a
그리고 광고가 어떤거 나오냐에 따라 점수가 오르락 내리락 한다.

 

PS. 또다른 점수 놀이 사이트 https://www.webpagetest.org

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

wordpress 커스텀 port로 보안서버 적용.

wordpress 의 경우 https 프로토콜을 지원한다.
다만 기본포트인 443 포트만 지원하고 있다.

 

웹호스팅을 쓸때는 꽁수 ‘ㅅ’a 로 커스텀 포트를 적용하는 법이 필요하다.
먼저 wp-config.php 에 아래와 같이 define 을 설정한다.
/* That’s all, stop editing! Happy blogging. */ 위에 설정해야 한다.

 

.htaccess 파일에서 아래와 같이 추가를 해준다.

HSTS 를 설정했기 때문에 구형 브라우져를 사용해서는 접속이 되지 않겠다. 장점으로는 SSL 적용으로 굼떠진 사이트 속도가 빨라진다.
Strict Transport Security (HSTS) 설정을 하면 보안서버가 만료되거나 제거 되었을때 설정된 max-age 까지 클라이언트의 캐쉬가 비워지지 않을경우 접속 되지 않을 수 있으니 주의가 필요하다.
HSTS는 브라우져에 향후 이 사이트에 대한 접속에 일반 http를 사용하지 않겠다는 선언이다.

 

아파치의 SSL 프로토콜 및 칩퍼는 아래와 같이 설정 하였다.
(ps. 2016-03-11 추가 SSLHonorCipherOrder on: 이설정은 보안 등급이 높은 방식을 우선시 사용한다는 설정이다.)

 

https://www.ssllabs.com/ssltest/index.html 에서의 테스트 스코어는 A+ 이며 IE6/XP 조합을 지원하지 못하는 설정이다.

20160314_PicPick_094231IE6/XP 를 지원하기 위해서는 프로토콜 SSLv3만 허용 처리, 그리고 HSTS를 꺼줘야 한다. 다만 등급은 C 로 떨어진다.