Secure coding(보안코딩) 구현 고려사항
시간이 지나면서 이런 내용도 기억하지 못할 거 같아서 적어둔다.
한국 나이로 50살이라는 늦은 나이에 코딩을 배우고 프로젝트 개발을 하고 보안검증 받으며 지적받은 사항 및 코드를 구현했던 사항 관련 내용이다.
2015년도 Youtube 영상을 보며 따라하기로 C# 언어를 독학으로 배우기 시작하면서 벌써 10년이란 시간이 흘렀다.
객체지향 개념이 뭔지도 모른 상태에서 자막 수집프로그램을 만들어보겠다고 밤을 세워가면서 좌충우돌 했던 시간이 주마등처럼 떠오른다.
맛보기 수준으로 Python, Node.js 등을 배웠지만 Secure Coding 모듈을 개발하지 못해서 프로젝트에 사용하지는 못한다.
Secure Coding 모듈을 개발하여 프로젝트에 활용한 것은 서버 언어는 PHP, Android APP은 Java, kotlin 언어다.
Front-End에는 jQuery 를 주로 사용했고, Modern Javascript 도 혼용 사용했다.
Flutter 언어는 동영상 강좌까지는 들었지만 보안코딩 모듈까지는 만들지 못했고, 이 언어로 프로젝트 개발을 해 본 적이 없다. 대기업에서는 반드시 보안코딩은 필수 요소이고, 보안코딩에 통과되지 못하면 운용 허가가 되지 않는다.
모든 해킹 위험요소를 다 해결해야만 운용할 수 있도록 허가된다.
인터넷에서 돌아다니는 보안코딩 없는 코드로는 기업 프로젝트에 사용될 수 없다.
서버 환경 구축
01. 서버 구성은 반드시 3Tier 구조로 구축해야 한다.
- Apache Web 서버 + WAS 서버 + DB서버 분리 구조
- Web서버에는 도메인 URL 및 SSL 인증서 이외에는 어떠한 정보도 없이 단순 Redirect를 하도록 구현한다.
- Virtual Box를 활용하여 가상의 서버 3대를 구축해서 연습해 본다. IPTime 공유기가 있다면 구성하는데 문제없다.
02. http.conf 환경설정에서 보안 요소를 모두 고려해야 한다.
03. conf.d/ssl.conf 파일에 SSL 인증서 설치 정보가 포함되어야 한다.
- 한국정보인증에서 제공하는 1년단위 갱신 인증서를 매년 업데이트해야 한다.
- SSL 인증서를 서버 적용 이외에 Web 방화벽에도 적용한다.
- 개인은 LetsEncrypt 무료 인증서를 적용하고 3개월마다 주기적으로 업데이트한다.
보안모듈 개발
01. 패스워드 암호화 : SHA256 + SALT 20자
02. Session 적용은 필수 요소이며, 앱(APP)과의 통신에도 반드시 Session 을 적용해야 한다.
03. 모든 INPUT 변수에는 XSSFilter 를 적용해야 한다.
04. SQL Injection 공격 방어를 위한 코드를 반드시 추가해야 한다.
- Legacy PHP : 적용 필수이며, PHP 7.4 이상 사용
- PDO(PHP Data Object) : 로직 자체가 SQL Injection 이 기본 적용되어 있음(정적 바인딩).
- PHP Framework : 라라벨, CodIgnitor는 SQL Injection 기본 적용
05. 로그인시 패스워드는 반드시 RSA 암호화/복호화(Javascript RSA 암호화 / PHP RSA 복호화) 적용해야 한다.
- Java RSA 암호화 또는 Kotlin RSA 암호화
- 회원 정보에 비밀번호 변경이 포함된 경우 반드시 RSA 암호화 통신 적용
- 최근에는 RSA 암호화/복호화 시 1회성 KEY쌍으로 생성하여 로그인시다마다 변경되도록 해야 한다.
- 가능하면 userID도 암호화하여 전송하고, 복호화하여 인증처리하는 것이 더 안전하다.
06. 로그인 실패시 팝업되는 메시지가 회원/비회원 구분없이 처리되어야 한다.
07. 동일 userID 중복 로그인을 체크하여 기존 로그인을 무조건 차단하는 로직으로 적용
08. 세션은 접속시마다 새로 생성하여 Session ID 유추가 불가능하게 처리해야 한다.
09. 서버의 세션 만료기한은 최대 1시간 적용해야 한다.
10. 파일 업로드시에는 반드시 허용한 확장자만 업로드 가능한 체크를 해야 한다.
11. 파일 다운로드시 ../ 사용을 못하게 체크해야 한다.
12. 로그인 인증 시 반드시 2차 인증을 적용해야 한다.
13. 2차 인증 수단으로 SMS 인증 기본 적용하고, 적용이 어려울 경우 Google OTP 인증 적용 권고
14. 특정 IP에서 과다한 접속 실패 발생시 접속 차단하는 로직 구현 적용 필수
- 동일 IP에서 10분 내 60개 이상 로그인 시도가 발생하고, 40% 이상 실패인 경우 1시간 이상 차단
- 동일 IP에서 12시간 내 300개 이상 로그인 시도가 발생하고, 40% 이상 실패인 경우 12시간 이상 차단
15. 로그인 접속/성공에 대한 모든 로그를 기록해야 하며, 관리자 화면에서 구현
16. 접속 5회 실패시 일정시간(5분 또는 10분) 접속 차단후 시간 경과하면 로그인 허용하는 로직 구현
17. 파리미터 변조 공격 대비
- 회원 정보를 임의로 탈취할 수 있는지 모의 해킹 점검하고 관련 코드 보완하라는 요청
- 회원 정보 식별 칼럼을 idx 로 했을 경우 인터넷 전송구간에서 식별할 수 없도록 암호화 처리 필수
- 권한 변경 등을 할 수 있는 칼럼 통신의 경우에도 반드시 인터넷 전송구간 암호화로 식별 불가토록 처리해야 함.
18. 에러 메시지 처리 파일(error.php) 구현 필수
- 비정상적으로 파일에 접근을 시도하면 error.php 파일로 리다이렉팅 처리
- httpd.conf 파일 안에 error.php 관련 설정 필수
- CentOS 7 WEB root 디렉토리에 .htaccess 파일에 설정 필수
19. 개인정보 유형별 마스킹 처리
- 화면에 노출되는 성명 반드시 마스킹 처리
- 휴대폰번호 반드시 마스킹 처리
- 접속 IP주소 반드시 마스킹 처리
- E-Mail 주소 반드시 마스킹 처리
20. APP 개발 고려사항
- 서버에서 받은 데이터를 SQLite 로컬 DB에 저장하지 말아야 한다.(지적사항)
- 앱은 반드시 1차 난독화 및 2차 난독화를 적용해야 하며, Scanrisk를 MainActivity에 추가해야 한다.
- 인증받은 폰번호와 다르면 로그인 불가 처리
- 서버에서 전달받은 User 정보를 Preference 에 저장하면 검증시 지적 ==> Global 변수 처리