기본적인 보안

Deny All, Permit Some 정책

"모든 걸 차단하고 필요한 것만 허용"1하는 정책은 단순하면서 강력한 정보 보호를 위한 최선의 정책입니다.

방화벽의 기본 정책도 이런 접근 방식을 취하고 있으며 만약 새로운 방화벽 정책을 추가한다면 허용된 ip와 포트를 명시적으로 지정하고 나머지는 차단하는 것이 필요합니다.

whitelist 기반 정책

위의 연장선으로 보안 정책을 만들 때 blacklist 정책보다는 whitelist 기반의 정책을 만드는 것이 좋습니다.

예로 관리자 기능이 있다면 관리자로 로그인할 수 있는 ip를 화이트리스트 방식으로 관리하는 것이 로그인할 수 없는 ip를 지정하는 블랙리스트 방식보다 안전합니다.

웹 애플리케이션을 만들고 있고 첨부 파일 업로드 기능이 있다면 마찬가지의 접근을 하여 허용된 확장자의 파일만 명시적으로 업로드를 허용하고 나머지는 다 차단해야 합니다.

최악의 상황을 가정하고 시스템 설계

우리가 만들고 구축하는 시스템은 최선을 다해서 구현하고 보안에도 신경을 쓴 신뢰성 있는 시스템이겠지만 이것이 끝은 아닙니다.

인터넷에는 늘 악의적인 사용자가 존재하고 이들은 우리 시스템을 해킹하여 직접적인 금전적인 이득을 얻거나 2차 경유지로 악용하려고 합니다.

이들은 영리하고 부지런하기까지 하므로 우리의 방어를 뚫고 침입할 수가 있으며 시스템을 설계할 때 해킹 당할수 있다고 가정하고 피해를 최소화할 수 있도록 구현해야 합니다.

가장 간단하고 효과적인 방법은 웹 서버같이 비무장지대(DMZ; DeMilitarized Zone)에 위치하는 서버는 네트워크를 사내 네트워크와 분리하고 웹 서버의 권한을 낮추고 접근할 수 있는 네트워크를 최소화 하는 것입니다.

서비스에 필요하지 않은 정보 노출 최소화

웹 서비스에 사용중인 운영체제, 웹 서버, WAS, 프레임워크, DBMS를 노출하면 공격자에게 유용한 정보를 제공하며 CVE(Common Vulnerabilities and Exposures) 같은 보안 취약점 DB 를 조회하여 공격할 수 있습니다.

위와 같이 서비스에 필요하지 않은 정보는 노출을 최소화하여야 하며 특히 예외가 발생할 경우 Stack Trace 정보를 사용자의 화면에 남기지 않아야 합니다.

루트 권한 최소화

치명적인 사고를 방지할 수 있는 좋은 작업 습관중에 하나는 루트로 실행하는 것을 최소화하는 것입니다.

정말 필요한 작업이 아니라면 루트로 로그인 자체를 하지 말고 꼭 sudo 로 해당 작업만 루트 권한으로 실행하는 것이 좋습니다.

암호화 전에 보유 필요 검토

유출되면 민감한 정보라 암호화를 고려하고 있다면 이 정보를 꼭 보유해야 하는지를 먼저 검토해 보십시요.

말장난같지만 개인 정보 유출에 가장 확실한 대비책은 암호화가 아니라 불필요하거나 과다한 정보를 보유하지 않는 것입니다.

혹시 나중에 어떻게든 비즈니스에 활용할 수 있을 것 같다는 막연한 느낌에 수집하고 있다면 보유 여부를 고민해 본 후에 적절한 암호화 방법을 선택하십시요.

secure coding 을 익히세요.

여기서 다루는 웹 서버 보안 이나 SELinux, iptables/firewalld 방화벽 은 프로젝트의 중간이나 종료후에도 크게 어렵지 않게 적용할 수 있습니다.

하지만 보안을 고려하지 않고 작성된 애플리케이션은 수정하려면 엄청난 시간과 비용이 발생하고 비즈니스를 한 순간에 무너뜨릴수 있습니다.

관리자와 사장님을 설득해서 프로젝트 초기에 시큐어 코딩을 익히고 개발 단계에서 이를 반영하는 것이 장기적으로는 비용이 더 싸게 먹히며 지속적이고 안정적인 비지니스를 수행할 수 있습니다.

주석

  • [1]: 외국의 유명 보안 회사중에 denyall.com 이라는 회사도 있습니다.