haproxy 로 DDoS 방어하기

이전에 봤던 내용인데 급히 보고 싶을때 링크를 못찾아서 메모용 으로 작성.  https://www.haproxy.com/blog/application-layer-ddos-attack-protection-with-haproxy/ 모든 상황에 100% 대응 할 수 있는 방법은 아니지만 WAF나 ALB, Route53의 GeoLocation Routing등과 같이 다른 서비스와 병용 함으로서 어느 정도의 효과를 얻을 수 있을 듯 하다.

sftp에서 파일과 디렉토리의 ls 결과에 대해

sftp로 파일을 전송하다가

조금 이상한 일을 겪었다. sftp로 서버에 접속한 후 파일을 전송하고 디렉토리를 “ls -l” 로 확인했을 때와 디렉토리내의 파일을 직접 “ls -l”로 확인했을때, 파일의 timestamp가 틀리게 나오는 걸 확인했다. sftp 클라이언트와 sftp 서버 쪽 timezone을 확인 해 본 결과 sftp 클라이언트는 timezone이 Asia/Tokyo 였고, sftp 서버쪽의 timezone은 UTC로 설정되어 있는게 이유가 아닐까 싶어 확인을 해 보았다.

 

timezone 변경과 확인

먼저 서버쪽에 ssh 로그인 후 timedatectl 로 확인해 본결과 역시나 UTC로 설정되어 있었다. timedatectl set-timezone Asia/Tokyo 명령어로 서버쪽 timezone도 클라이언트와 동일하게 설정해 주니 ls -l 로 디렉토리와 파일을 지정했을때 timestamp 가 엉뚱하게 나오는 현상은 해결 되었다. 

그런데 문제는 해결 되었는데 도대체 왜 이런 현상이 발생하는지 이해가 안간다. 디렉토리와 파일 모두 timestamp 가 동일하게 나온다면 그러려니 하겠는데 디렉토리와 파일에 대해 ls -l 을 실행한 결과가 다르게 나온다는건 조금 이해가 되지 않는다. 인터넷을 검색해 보아도 특별히 보고된 issue 같은 건 없는 듯 하니… 소스 파일을 직접 검색해 보는 수 밖에 없을려나.

 

sftp 소스 분석

sftp 의 소스 파일은 어디에서 받을 수 있을까. 검색 결과 https://www.openssh.com/ 에서 다운 받을 수 있었다. 미러 리스트로부터 적당한 링크를 클릭하여 wget 으로 openssh-8.0p1.tar.gz 파일을 다운 받아 압축 해제를 하고 소스를 확인 하였다. 관련 있는 함수는 sftp-common.c 파일의 ls_file()과 sftp-client.c의 do_readdir() 함수 정도 일려나.

do_lsreaddir(struct sftp_conn *conn, const char *path, int print_flag,
     SFTP_DIRENT ***dir)
 {
   struct sshbuf *msg;
   u_int count, id, i, expected_id, ents = 0;
   size_t handle_len;
   u_char type, *handle;
   int status = SSH2_FX_FAILURE;
   int r;
... 생략 ...

sftp-client.c 의 do_readdir()은 do_lsreaddir()을 불러오고 있어서 do_lsreaddir()을 확인해 보았지만 특별히 눈에 띄이는 점은 없다. 다음으로 sftp-common.c 파일을 확인 해보았다.

ls_file(const char *name, const struct stat *st, int remote, int si_units)
{
   int ulen, glen, sz = 0;
   struct tm *ltime = localtime(&st->st_mtime);
   const char *user, *group;
   char buf[1024], lc[8], mode[11+1], tbuf[12+1], ubuf[11+1], gbuf[11+1];
   char sbuf[FMT_SCALED_STRSIZE];
   time_t now;
... 생략 ...

헐… 자세히는 모르겠지만 파일의 stat로부터 localtime 을 적용시키고 있는 듯 하다. 그렇다면 설명이 된다.ls -l로 디렉토리를 지정했을 경우에는 ls 의 결과를 그대로 받아와서 출력하지만 파일을 지정했을 경우엔 localtime 으로 변경후 반환해 주는 듯 하다. 할려면 똑같이 해줬으면 좋겠는데… 어느쪽이 맞냐고 한다면… 서버 쪽의 timestamp 를 그대로 반환해 주었으면 좋겠는데 말야…

 

다음에 시간 나면 소스를 수정하여 컴파일 한 후에 제대로 동작하는지 테스트 해보고 싶다. 시간에 여유가 생겨서 해볼 수 있다면 다시 결과를 남기도록 하겠다.

댓글

이 블로그의 인기 게시물

curl 명령어 옵션

CISCO 2960s 초기화 후 기본 설정

AWS에서 zabbix를 이용한 autoscaling ec2 자동등록/자동삭제