[개안뽑] ③대충 만든 서버 쓰니까 그 모양이지

14
pabii research
서버 대충 만들었으니 해킹 당하는건 당연한거잖아
그럼 서버 잘 만들어야 되는데, 왜 이렇게 일이 많지?
시킬 문제가 아니라 그냥 내가 혼자서 다 찾아보고 직접 만들어야 되더라

해킹 사건을 어느 정도 마무리하고, Sucuri 담당자들이 우리 서버 앞에 감시 방화벽을 강화하는 추가 비용을 써야 된다, 기존과는 다른 방식으로 서비스를 관리해야 된다 등등의 각종 메세지를 열심히 보내주던 9월 말 무렵이다.

솔직히 말해서 우리 회사가 미국에 있었으면 계속 썼었을 것 같은게, 정말 친절하기도 하고, 지식이 많아서 내가 뭘 놓치고 있는지, 어디서 뭘 찾아봐야하는지를 상세하게 알려줬었다. 근데 도움을 받고 지식이 쌓이면 쌓일수록 이제는 내가 직접 한국에서 방화벽 세우고 서비스 돌려야겠다는 생각이 스물스물 올라오더라. 아무것도 모르는 주제에 어줍잖게 줏어듣고 머리가 커진 셈이다.

6일이나 되는 황금 추석 연휴 내내, 나는 계속 서버 공부만 했었다. 돈이 수십 억원이 든다고 하면 선택하기 어렵겠지만, 적당한 돈을 내더라도 개발자 없이 안전하게 운영할 수 있는 서비스를 만들어내야 한다는 생각에 유료 서비스들을 이것저것 찾았는데, 연간 1~2천 달러에서 5천 달러 남짓으로 매우 좋은 서비스들이 세상에 많이 있다는 것을 처음 알게 됐다.

개발자-안-뽑음_202312
개발자-안-뽑음_202312

대충 만든 서버 쓰니까 그 모양이지

그 시절 해킹 당해서 괴롭다고 말을 하면 들었던 이야기들은 대부분 너네 회사 개발자들 어쩌고 하는 욕이었는데, 우리 회사 재직했던 개발자들이 자기 욕을 듣고 화를 내던 것 이상으로, 나도 사람을 잘못 뽑고, 잘못 운용했다는 책임이 있는만큼 뼈를 때리는 것 같이 듣기 괴로웠다.

대충 만든 서버 쓰니까 그 모양이지

그 중 가장 뼈가 아팠던 내용이 위의 문구였는데, 그 전까지만 해도 어떻게든 만들어놓은 서버를 최대한 유지할려고 그랬었다가, 생각을 완전히 바꾸게 됐던 계기가 됐었다. 원래는 방화벽만 내가 직접 장비를 사서 한국에서 쓰거나, 어디 국내 서비스로 바꾸는 정도에서 타협하고, 기존 시스템을 최대한 살려서 쓸 생각을 했었는데, 저 말을 듣고 나니까 또 같은 문제가 터지면 어쩌나는 생각이 들었다. 그래 바꿔야지.

기존 시스템을 쓰던 당시에 SSL 인증서 갈아 끼우면서 a2ensite 명령어 치던 기억을 거슬러 올라가 우리 회사 서버가 Apache 서버로 돌아가고 있던 것을 그 때서야 알게 됐는데, 이게 동적 접속(Dynamic connection)을 지원해주는 대신에 속도가 느리다는 표현을 주워듣고, 어차피 우리 회사 서비스 대부분이 이미 써 놓은 글, 외부에 호스팅 되고 있는 동영상 중계 밖에 없는만큼 다른 서버 기술 스택을 찾아야겠다는 생각을 하게 됐다.

(나중에 겪으면서 알게 됐지만, 네트워크 서버 시스템을 구축하는게 정말 큰 도전인데, 내가 이 때 정말 무모한 결정을 했다는 것도 알게 됐다)

변경서버_After_202312
변경서버_After_202312

주워들은 지식으로 새 서버 만들기

위는 현재 우리 회사 서버가 돌아가는 구조다. (정확하게는 몇 부분 아직 미완성이긴 한데, 주말에만 작업을 하다보니 좀 늦어졌을 뿐, 조만간 다 완성할 수 있을 것 같다.)

이쪽 관련 지식이 없는 분들은 지난 글에 나온 예전 서버와 비교해서 뭔가 박스가 많아지고 복잡해졌다는 생각만 들 수도 있고, 좀 아시는 분들이라면 꼴에 이 정도 했다고 자랑하냐고 생각하실 수도 있을 것이다. 자랑할 생각은 없고, 그냥 배우다 지친 상태다. 앞으로 더 많이 배워야 할 것 같은데, 이제 좀 안 하고 싶어진 상태고, 저 그림 가운데에 있는 Data Dashboard에나 집중하고 싶다.

대학원 수준의 수학·통계학을 써서 Data Science 연구 분석을 위주로 하는게 내 주력 역량인데, 서버만 계속 붙잡고 있는 건 진짜로 내가 할 일이 아니라는 생각 밖에 없다. 하루 빨리 손을 떼고 싶은데, 그간 다른 글에서 반복적으로 이야기했던대로, 내가 원하는 서버를 만들어 줄 수 있는 인력을 못 찾았기 때문에 내가 손을 댈 뿐이다.

먼저, 방화벽을 구축해야한다는 일념하에 장비를 2개 구매했다.

첫번째 장비는 우리가 일반적으로 알고 있는 Wifi 라우터랑 비슷한 목적인데, 외부에서 들어온 회선을 내부망에 연결하는 장비면서 온갖 종류의 셋팅을 다 할 수 있다. 저 셋팅은 아직 10%, 아니 5%도 공부를 못 했는데, 정말 안 하고 싶어서 내려 놓고 있는 중이다. 내가 상상하던 거의 모든 셋팅을 다 할 수 있다는 건 주워들어서 알겠는데, 내가 하는건 언제나 힘들단 말이지.

두번째 장비는 내부망에서 10G로 돌아갈 수 있도록 만들어진 스위치 허브다. 예전에 서버 3대를 물려 분산 서버를 돌리던 시절, 서버 1대가 모든 트래픽을 받고, 그 서버에 1G 스위치를 물린 다음, 3대의 서비스 서버를 붙여서 썼던 기억이 어렴풋하게 있는데, 그 1G 스위치는 사무실 어딘가에 쳐 박혀 있는 상태다. 저 10G 스위치를 새로 산 이유는, 저 안에 또 DDoS 공격을 막는 것부터 시작해서 각종 기능이 있고, 앱이 있어서 서버들의 접속 상태를 실시간으로 확인할 수 있는데다, 서버 다운이 되면 이메일이 온다.

위의 두 장비를 제대로 셋팅만 할 수 있으면 고가의 외부 방화벽 서비스를 쓰는 것에 준하는 내부 시스템을 갖출 수 있겠다 싶더라. 방화벽이 2단계로 작동하는 셈이 되기 때문이다.

기존서버_Before_202310
기존서버_Before_202310

장비만으로는 안 된다, 서비스도 엮어야 보안이 완성된다

지난 글에 소개했듯이 바로 위의 이미지는 10월까지 쓰던 과거 서버 상태인데, 더 위의 신규 서버와 비교해보시면 확실히 복잡해졌다는게 눈에도 들어 올 것이다. 처음에는 저런 지식을 다 쌓고 난 다음에 이젠 만들어놓으면 해킹 안 당하는건가는 기대감도 있었지만, Stackoverflow, ServerFault, Reddit, AskUbuntu 같은 각종 해외 커뮤니티들을 돌면서 장비만 믿고 있어서는 안 되고, 서비스도 그걸 활용하는 방식으로 구성해야한다는 문구를 봤다.

그 조언 문구 덕분에 여기에 그치지 않고, 반드시 보호해야 하는 워드프레스 서버 관리를 위해서 서버 앞에 뭔가 또 다른 걸 달아줘야 되겠다는 생각을 했는데, 그게 바로 저 위의 Varnish cache 서버다.

일반적으로는 웹사이트 속도가 느리니까 정보를 캐시(Cache)를 해서 보여주는 방식으로 접속 속도를 높인다.

잘 아는 것은 아니지만 일천한 지식을 공유해보면

  • 일반 접속: 접속자 -> 서버 -> 서버 내 서비스 플랫폼 -> 서비스 -> 웹페이지 생성 -> 서비스 플랫폼에 전달 -> 서버에 전달 -> 접속자에 전달
  • 캐시 접속: 접속자 -> 서버 -> 캐시에 있는 웹페이지 전달 -> 서버 -> 접속자에 전달

구조가 되는 것으로 알고 있다.

좀 더 구체적인 내용은 앞으로 남아있는 수십개의 글에서 풀어낼 작정인데, 위의 간략화한 버전을 썼다고 또 이상한 메일을 보내고 날 험담하는 FXXXBook 댓글을 달지는 말아주시면 좋겠다. (쉽게 이해하라고 수학적인 직관만 남기고 엄밀한 증명은 안 맞는 내용을 어딘가에 써 놨더니 날 더러 틀렸다고 메일이 왔길래 수학 직관을 위해서 Robustness를 포기했다고 답장해줬더니 FXXXBook 어딘가에 메일 내용과 함께 날 험담하는 댓글을 쓰신 분이 기억난다. 내가 쓴 글 대부분을 아예 이해도 못하는 분들이 너무 많아서 Robustness를 포기하는 순간도 괴로운데, 그런 글을 보면 뭐랄까, 내가 왜 쉽게 쓰겠다고 그러다가 이런 욕까지 먹어야되나 싶은 생각이 든다.)

아뭏튼 다시 캐시로 돌아와서, 저 Varnish cache를 쓰면 로그인을 한 이용자가 아닌이상 서버 구조의 더 뒤에 있는 워드프레스나 데이터 서버에 접속 없이 바로 Varnish만 찍고 나간다는 것을 알게 됐다.

그럼 뒤에 있는 서버는 정말로 안전해지는 거잖아? (물론 로그인을 한 것처럼 뚫고 들어올 수 있다는 것도 알게 되긴 했으니까 너무 공격하진 말자.)

중고 서버(ThinkStation P700)를 이베이에서 110달러에 한 대 사고, CPU 2개(E5-2699 v3)를 각각 40달러에, 램 32GB(DDR4 2133…) 8개를 각각 25달러 + 쿠폰 할인까지 받아 배송비 포함해도 500달러 남짓에 램만 잔뜩 들어간 서버를 한 대 구축했다. 저 Varnish cache는 웹사이트 정보를 램에 얹어서 제공해주기 때문에 램이 좀 커야 된다는 이야기를 듣고 원래는 한 128GB 정도면 충분하겠지? 라고 생각했다가 가격이 너무 저렴하길래 4개를 더 사 버렸다.

  • 18코어 x 2
  • 256GB 램

이렇게 AWS 같은 클라우드 서비스에서 EC2로 쓸려면 한 달에 얼마들어가는지 계산해보시면 저 500달러 남짓의 비용이 얼마나 저렴한 서버 장비인지 대략 짐작을 하실 수 있을 것이다.

위의 장비 2대와 서버 1대까지 대략 1,000달러 남짓의 비용을 썼다. (보안 비용으로 그간 Sucuri한테 얼마를 냈더라…?)

저걸 다 셋팅하는 노동력(과 매달 몇 만원의 전기세)을 생각하면 만만치 않은 비용이기는 하겠지만, 남한테 의지 안 하고 내가 직접하니 노동비가 줄어들었고 (Read 주말이 삭제됐고), 이제는 남의 서비스에 의존하지 않고 서버를 만들 수 있게 됐다.

나머지 장비는 사무실에 굴러다니던 잉여 서버들을 활용했는데, 내가 조금만 힘들여 고생하면 1,000달러 남짓의 비용으로 서버 보안도 강화하고, 웹사이트 접속 속도도 높이고, 쓸데없는 비용도 안 쓸 수 있게 되는데, 그간 난 뭘 했었나 싶어서 한참 자책을 했었다. 왜 나는 개발자들만 믿고 알아서 잘 해 줄 것이라고만 생각했었을까?

(연봉 많이 달라는) 개발자면 알아서 잘 하겠지?

네트워크 시스템을 저렇게 만든다고 보안이나 서비스 접속 속도 문제가 깔끔하게 해결이 되는 것도 아니고, 아직도 온갖 문제가 더 산적해 있다. 서버는 QUIC을 이용해서 http3 접속을 열어줘야 하는데 아무리 이것저것 찾아봐도 계속 http1.1로만 접속된다, 그나마 Firefox는 http2로 접속되네? 뭐지 Header 값이 다르게 적용됐나? DB는 키 값을 나름대로 바꿔 끼워봤는데 여전히 내 마음에 드는 효율화가 안 되어 있다. 답답해서 주워듣기만 했던 Redis를 처음 설치해보고 PHP에 연동시켰더니 뒤에서 Cron job이 몇 개 동시에 돌면 Redis가 바로 다운 되길래 Redis cache 사이즈를 늘려놨는데 그래도 계속 같은 문제가 반복된다. 도대체 얼마나 크게 잡아야되는거야? 셋팅을 잘못했나? 워드프레스는 각종 캐시 플러그인들을 다 테스트해봤는데, 결국 남들이 제일 좋다고 입을 모으는 걸 고르게 되기는 했는데, 가끔 CSS가 깨진 화면이 뜨고, 다크 모드 전환도 이상하게 꼬이고, 분명히 dark-mode.css랑 js를 빼고 minification을 돌렸는데 왜 저러는거야…. 마음 속에 있는 문제의 한 5% 정도만 이야기를 한 것 같은데 벌써 문단 하나가 꽉 찼다.

이런 문제를 주말이 아니라 평상시에 계속 보고 있으면 회사가 안 돌아간다. 내가 할 일이 산더미처럼 쌓여 있기 때문이다. 보통은 해외 유료 솔루션들은 메일 보내놓으면 1-2일 안에 답장이 오는데, 그걸 적용해보고 안 되면 또 보내보고 이러면서 지난 2달의 2번째 달이 지나갔었다.

그렇다고 개발자를 뽑으면 잘 해결이 되는가? 적어도 나는 이 레벨의 도전에서 국내 개발자를 뽑아서 문제를 해결할려는 의지를 완전히 상실했다. 잘 하는 누군가가 있겠지만, 나랑은 인연이 아니더라.

Never say never

라고 하던데, ‘절대로’라는 표현을 쓰는 건 위험하겠지만, 아마 내가 한국에서 개발 업무를 ‘외주’주는건 몰라도 ‘채용’하는 일은 아마 ‘절대로’ 없지 않을까 싶다.

DB에서 이미지 URL 위치 찾아서 수정하는데 1주일이 걸리는 개발자를 뽑아놓고 저 위의 셋팅, 최적화 작업을 다 하라고 시키면 얼마나 오랜 시간이 걸릴까? 비개발자가 고작 2달 동안 파트타임으로 작업한 주제에 아는체 한다고 구박하면 할 말이 없지만, 그간 내 경험상 한국에서 내가 지난 2달간 겪고 해결해 온 문제, 앞으로 해결해야하는 문제를 혼자서, 단 시간에 다 정리할 수 있는 개발자 찾기는 a needle in a haystack 급의 도전이 될 것이다.

저 방화벽이 또 뚫리면, 국내 보안 전문 업체를 찾아가는게 아니라 해외의 Nginx Plus를 쓰거나, LiteSpeed로 서비스를 갈아 타는 결정을 할 것이다. 아니면 Sucuri를 다시 찾아가거나. 그 분들이 한국의 어지간한 보안 전문가들보다 훨씬 더 ‘최신’의 ‘고급’ 기술력을 갖춘 분들이고, 한국에는 그런 ‘기술’ 주워듣고 와서는 ‘적용’하는 분들 위주로 보안 시장이 형성되어 있다는 것을 각종 경험을 통해 알게 됐기 때문이다. 한국은 기술을 생산하는 시장이 아니라, 기술을 ‘갖고와서’ ‘적용’하는 시장이다. 내가 영어 실력이 부족하나? 직접 그 기술력 갖춘 회사와 대화할 수 있는 ‘기술 이해도’만 높이면 해결되는거잖아?

짧게 요약했지만, 저 하나하나의 결정이 있기까지는 굉장히 많은 고민이 있었다. Varnish cache를 쓰려고 하기 전에는 Nginx를 이용해서 Reverse proxy 셋팅을 하고, Nginx에서 제공하는 무료 방화벽인 ModSecurity를 내가 직접 셋팅할까, 해외의 전문 업체에 부탁을 할까는 생각도 했었고, LiteSpeed는 한 달 유료 버전을 구매해 보기도 했다. 이런 고민과 시행착오 없이 좋은 서비스가 덜컥 완성되지 않는다는 것도 알게 됐고, 이걸 개발자가 못 한다고 화를 낼 시간에 그냥 내가 직접 찾아보고 만드는 편이 훨씬 더 비용 절감, 시간 절감, 퀄리티 향상에 도움이 된다는 것도 알게 되는 시간이었다.

‘절대로’가 깨지면 좋겠지만, 아마 한국에서 내가 뽑을 수 있는 인재 풀에서 ‘절대로’를 깨기는 쉽지 않을 것이다.

Similar Posts

3 Comments

  1. CSS의 display 속성에서 inline과 block의 차이를 정확히 알고 사용하고 계신가요? 😄 이 둘을 합쳐놓은 inline-block이라는 녀석은 또 뭘까요?

    1. .grid-container {
      display: grid;
      grid-template-columns: 30px 200px auto 100px;
      }

답글 남기기