[실전 security ⑧] 보안 점검 Check Sheet

보안, 암호화 2008. 8. 18. 17:41 posted by 무병장수권력자


실전! 개발자를 위한 Security 체크 포인트
⑧ 보안 점검 Check Sheet

작성자 : 김문규
최초 작성일 : 2008. 8. 12
* 본 포스트는 SDS e-campus의 '실전 개발자를 위한 Security 체크포인트' 강의 내용을 발췌하여 재구성한 개인적인 학습노트 입니다.

이번 포스트는 그동안 연재한 웹 서비스 시스템 개발 보안의 강좌의 마지막 입니다. 실제 구현 시 확인해야 할 체크 포인트 들입니다. 굉장히 많습니다. 귀찮습니다. 하지만, 보안은 누군가가 귀찮아야 하는 것이라는 것을 명심하시길 바랍니다.

1. 설계 단계
1) 접근 통제 정책 설계 시 핵심 Check Point
- Access 권한 설정 기준이 있는가?
- Access 권한 설정 기준은 "최소한의 권한 원칙(Least privilege)"을 적용하였는가?
- 동일 사용자 ID로 다른 PC에서 동시 로그온이 불가능 한가?
- 일정시간 미사용 시 자동 로그오프 되는가?
  (30분 이상 미사용 시 자동 로그오프를 권장하나 업무의 성격에 따라 변경가능)
- 무자격 사용자 ID(예. 퇴직, 전배, 6개월이상 미사용자)를 자동 제거 하는 프로세스가
  있는가?

2) 감사 정책 설계 시 핵심 Check Point
- 사용자별 접속내역 로깅을 기록관리하는가?
 (로깅항목: 사용자 ID, Login/Logout시간, 접속IP)
- 접속내역 로깅을 보관하고 있는가?
 (3개월 이상 보관 할 것을 권장하나 업무의 성격에 따라 변경 가능)
- 사용이력 로깅을 기록관리하는가?
 (로깅항목: 사용자ID, 사용시간, 사용이력-조회,수정,삭제, 프로그램ID)
- 사용이력 로깅을 보관하고 있는가?
 (3개월 이상 보관 할 것을 권장하나 업무의 성격에 따라 변경 가능)
- 로그온 시 보안경고 메시지 및 최종 사용정보를 표시하는가?
 (보안메시지- 시스템에서 하는 모든 활동이 모니터링 되고 있음을 알림,
 최종사용정보- 로그온 시 최종 사용시간, 접속IP를 표시)

3) 상세 설계 시 핵심 Check Point
- 입력값이 정확하게 들어오는지에 대한 검증이 이루어지고 모듈간 전달되는 파라미터값을 검증하도록 설계되어 있는가? 
- 입력값의 검증시 Client쪽만의 검증에 의존하지 않고 서버쪽의 검증도 수행하는 방식으로 설계하는가?
- 웹 어플리케이션 설계시 대표적인 입력공격(XSS, SQL injection공격 등) 등에 대한 대책이 설계되었는가?
- 다양한 사용자에 대한 어플리케이션 접근 위험이 분석되어 이에 따른 식별 및 인증 방안이 설계 되었는가?
- 강화된 인증이 요구되는 경우 생체인식이나 인증서 등의 강화된 인증 방식을 설계하였는가?
- 식별 및 인증을 통합 관리하는 방안이 설계 되었는가?
- 어플리케이션의 서비스 계정은 최소 권한 요구사항을 만족하는가?
- 일정기간 사용하지 않는 서버 계정은 사용 중지가 되도록 설계되는가?
- 인증의 문제발생시 계정을 즉시 Disable시킬 수 있도록 설계되어있는가?
- Client가 인증할 경우 암호화되지 않은 인증 값을 전달하지 않도록 설계되는가?
- 인증을 위하여 cookie를 사용하는 경우 cookie보호를 위한 암호화를 적용하는가?
- 어플리케이션이 강력한 패스워드를 강제하는가?
- 패스워드의 주기적인 변경, 실패 로그인 시도수를 제한하는가?
- 패스워드의 유출방지를 위해 패스워드가 암호화되어 저장되도록 설계되었는가?
- 인증 실패시 너무 많은 정보를 제공하지 않도록 설계하는가?
- 같은 사용자 계정으로 한명 이상이 로그인했을 경우를 허용하지 않도록 설계되었는가?
- 로그온이후 일정시간 동안의 사용이 없을 경우 자동 로그아웃되는 등이 설계에 반영되었는가?
- 허가를 위해 가능한 Role-based 접근방법을 사용하는가?
- Role을 사용할 경우 Role에 대한 적절한 권한 분리가 이루어지는가?
- 응용프로그램이 시스템레벨의 자원을 접근할 경우 꼭 필요한 것만 접근할 수 있도록 설계되었는가?
- 응용프로그램이 DB에 접근할 경우 직접적인 접근이 아닌 가능한 stored procedure를 사용하여 간접적으로 접근하도록 하는가?
- 일반사용자는 응용프로그램을 통하지 않고는 정보가 저장되어 있는 데이터베이스에 접근할 수 없도록 설계되었는가?
- 하나의 강력한 관리자 권한을 부여하지 않고, 개발자, 운영자, 시스템 관리자 등의 권한의 차별화를 고려하여 권한에 적합한 관리자 권한을 설정, 부여하는가?
- 응용프로그램의 기능사용을 통제하기 위한 메뉴 환경이 제공되는가?
- 응용프로그램의 구성설정 내용의 저장은 안전하게 저장되도록 하는가?
- 일정기간 동안 미사용시 사용자의 로그인 기능을 폐쇄하도록 설계하는가?
- 세션 identifier를 암호화되지 않은 채널로 전송하지 않도록 하는가?
- 세션 쿠키는 암호화하여 전송하는가?
- Query string내의 session identifier를 전달하지 않도록 설계하는가?
- Session lifetime은 제한하고 Session 상태를 안전하게 저장하도록 하는가?
- 동일 사용자의 동시 세션수를 제한하는가?
- 민감한 데이터의 저장시 암호화 등을 통하여 안전하게 저장하는가?
- 민감한 데이터의 네트워크상의 전송시 유출이나 변조에 보호되도록 암호화 등의 대책을 적용하는가?
- Cookie에 민감한 데이터를 저장하지 않도록 하는가?
- 민감한 데이터의 사용에 대한 로깅을 수행하는가?
- 암호화 적용시 개별적인 암호화를 사용하지 않고 증명된 암호화를 적용하는가?
- 암호화를 적용할 경우 적절한 키 사이즈와 정확한 알고리듬을 적용하는가?
- 암호화키를 안전하게 보관하도록 설계하는가?
- 암호화키가 주기적으로 변경될 수 있도록 하는가?
- 다음과 같은 주요 보안 로깅/감사를 위한 항목을 정의하고 로깅 메커니즘을 설계하였는가?
 : 실패 로그인/로그아웃
 : 인증정보의 변경
 : 특수 권한의 수행
 : 주요 Operation의 수행 등 
- 정보보호로그기록이 허가되지 않은 인력에 의해 삭제되거나 기능이 제거될 수 없도록 설계되었는가?
- 정보보호로그를 분석할 수 있도록 설계되었는가?
- 개발자, 운영자, 시스템 관리자 등의 권한의 차별화를 고려하여 관리자 권한을 부여하는가?
- 구조화된 예외처리를 사용하여 민감한 정보가 예기치 않게 누설되지 않도록  하고 있는가?
- Client에게 많은 정보를 누설하지 않도록 예외처리 메시지 집합을 정의 하는가?
- 사용 및 전송 데이터에 대한 무결성 요구가 있을 경우 무결성 요구에 대한 설계가 이루어졌는가?
- 메시지에 대한 부인방지 요구가 있을 경우 부인방지 요구에 대한 설계가 이루어졌는가?

4) 테스트 시나리오 작성 시 핵심 Check Point
- 테스트의 목적과 책임이 정의되었는가?
- 테스트의 범위, 가정, 제약조건, 상호연관성이 정의되었는가?
- 테스트 방법론 및 절차가 정의되었는가?
- 테스트 시나리오가 정의되었는가?
- 테스트 계획, 테스트를 위한 준비사항이 정의되었는가?
- 테스트를 위한 팀의 구성 및 책임과 역할이 정의되었는가?
- 테스트의 평가 기준이 정의되었는가?

2. 개발 단계
1) 개발 단계 Check Point
- 중간페이지를 비정상적으로 접근이 불가능 한가?
 (중간페이지까지 정상적으로 접속후 해당 URL book-marking후 다른 브라우저에서 중간페이지 접속 시도)
- Data를 조회할 때 URL에 표시되는 Key값을 변조하여 권한 밖의 정보 조회가 불가능한가?
- 중요정보(Password, Key값)가 쿠키, Get방식, Hidden 등에 매개변수 조작이 가능한 평문형태로 존재하지 않는가?
- 신뢰되지 않은 입력에 대해 유효성을 체크하는가?
- SQL Injection을 이용하여 인증을 통과하지 않는가?
- 불필요한 에러 메시지를 출력하여, 시스템 정보가 노출되지는 않는가?
- HTML 주석에 필요이상의 정보가 노출되어 있지는 않은가?
- 암호 구현시 공인된 알고리즘이 사용되고 키는 안전하게 저장되어 있는가?
- 사용자가 원격에서 실행 가능한 임의의 프로그램(PHP, ASP, JSP 등)을 업로드할 수 없도록 차단되었거나 실행되지 않도록 되어있는가?
- 사용자로부터 html tag 입력이 불가능하도록 되어있는가?

3. 구현 단계
1) 구현 단계 Check Point
- S/W의 기본취약점 및 디폴트 패스워드는 제거 되었는가?
- 기존에 운영중인 중요한 Data가 안전하게 전송, 생성, 폐기 되었는가?
- 시스템 릴리이즈전 보안담장자나 CERT요원에 의해 보안성 검토를 수행하고 이를 책임자에게 보고 하였는가?
- 설계서에서 제시된 정보보호 요구기능들이 구현되는가?
- 각종 정보보호시스템들이 구현되는가?
- 정보보호 관련 코드는 별도로 문서화하여 관리하는가?
- 구축 시 정보보호관련 설계변경 요구시 그 영향도와 위험을 평가하여 변경승인을 수행하는가?
- 승인된 설계변경 사항들을 추적하여 문서화하고 있는가?

2) 운영 단계 Check Point
- 시스템에 대한 이관 및 운영을 위한 운영관리 방안 및 계획이 수립되었는가?
- 정보시스템의 안전한 관리를 위하여 운영자들을 위한 설명서가 작성되었는가?
- 정보시스템의 안전한 이용을 위하여 사용자들을 위한 정보보호 설명서가 작성되었는가?
- 접근 권한관리가 적절히 이루어지고 있는가?
- 운영시스템에 대한 변경은 절차에 의해 이루어지고 기록 관리되고 있는가?
- 주기적으로 자체점검활동을 하고 그 결과를 보고하고 있는가?
- 점검결과가 문서화 되고, 주관 기관의 승인을 득하였는가?
- 점검 결과 정보보호 대책 및 기능이 적절히 작동하는지 평가되었는가?
- 취약성 분석을 수행하여 명시된 대책이 시스템의 알려진 취약성으로부터 충분히
 보호하는지 평가되었는가?

4. 맺음말
항상 마지막 포스트를 정리할 때는 뿌듯함이 느껴집니다. 마치 책거리를 하는 느낌입니다. 이번 포스트도 제가 부족한 부분인 보안을 공부하면서 시작했는데... 이렇게 길고 커질 줄은 몰랐습니다. 정리하다 보니 실을 포스트에 정리된 내용은 너무나 간단해서 실전에 적용할 것이 없다고 생각되네요.
하지만, 이런 기본들이 쌓여서 다음번 보안 교육때는 더 고급 과정을 이해할 수 있으리라고 기대합니다. 저와 같은 보안 초보 개발자들에게 한줄기 빛과 같은 강좌였길 바랍니다. ^^

그럼 이만! 쓩!