본문 바로가기

정보처리기사 실기/06. 보안엔지니어링

[2020 정보처리기사 실기 - 소프트웨어 개발 보안 구축] 1. 소프트웨어 개발 보안 설계하기 (2)

 

 

 

* 입력데이터 검증 및 표현 관련 보안 

 

1) DBMS 조회 및 결과 검증

   - 애플리케이션의 DB연결 계정에 대해 권한을 최소한으로 부여해야 함

   - 외부 입력값을 사용하는 SQL 문 생성시 입력값을 정적 바인딩하거나 불가피하게 동적 바인딩을 해야할 경우 입력값 검증 후 사용

 

2) 시스템 자원 접근 및 명령어 수행 입력값 검증

   - 외부 입력값이 시스템 내부자원을 직접적으로 식별하는데 사용되지 않도록 해야함

   - 서버 프로그램 내에서 셸을 생성해서 명령어를 실행할 경우 외부 입력값이 실행명령어로 직접 사용되지 않도록 해야함

 

3) 웹서비스 요청 및 결과 검증

   - 사용자 입력값을 동적 생성 페이지에 사용하는 경우 XSS가 유발하지 않도록 입력값을 검증하고 필터링

   - DB에 저장된 값을 조회하여 동적 생성 페이지에 사용하는 경우 XSS가 유발되지 않도록 필터링 하거나 HTML 인코딩 후 출력

 

4) 웹기반 중요 기능 수행 요청 유효성 검증

   - 사용자의 권한 확인이 필요한 중요기능에 대해 정상적인 사용자의 유효한 요청인지 여부를 확인할 수 있어야 함

 

5) HTTP 프로토콜 유효성 검증

   - 외부 입력값을 쿠키나 HTTP 헤더정보로 사용하는 경우 HTTP 응답분할이 발생하지 않도록 필터링

   - 외부 입력값이 페이지 이동 URL로 사용되는 경우 해당 URL이 허용된 목록에 포함되어 있는지 검증 후 사용

 

6) 허용된 범위 내 메모리 접근

   - 메모리 버퍼의 경계값을 넘어 메모리를 읽거나 저장하지 않도록 경계 설정

   - 메모리 버퍼 오버플로우를 유발할 수 있는 취약한 함수는 사용하지 않기

 

7) 보안 기능 동작에 사용되는 입력값 검종

   - 사용자의 역할이나 권한을 결정하는 정보는 반드시 서버 측의 세션이나 DB에서 관리

   - 쿠키나 외부 입력 파라미터를 보안기능의 인자로 사용할 경우 검증작업 수행후 제한적 사용

   - 중요 상태정보나 인증 권한 관련 정보는 쿠키를 이용해서 전송되지 않아야하고 불가피하게 전송할 경우 암호화하여 전송

 

8) 업로드 다운로드 파일 검증

   - 업로드 파일의 타입 크기 개수를 제한하고 실행권한 제거

   - 업로드된 파일은 외부에서 직접 접근이 불가능한 경로에 저장하고 저장된 파일은 랜덤하게 변경하여 사용

   - 파일 다운로드 요청시 요청 파일명에 대한 검증작업을 수행하고 허가된 사용자에 대한 다운로드 허가된 파일인 지 확인

   - 원격지에서 다운로드한 소스코드나 실행파일은 무결성 검사 수행

 

 

 

* 보안기능 관련 보안 고려사항

 

1) 인증 대상 및 방식

   - 중요기능이나 자원은 인증 후 사용

   - 인증 우회나 권한 상승이 발생하지 않도록 안전한 인증방식 사용

   - 중요기능에 대해 2FACTOR 인증을 고려

 

2) 인증 수행 제한

   - 로그인 시도회수 제한, 초과 시도에 대한 인증 제한 적용

   - 반복된 로그인 실패에 대해 사후분석이 가능하도록 로그 기록

 

3) 비밀번호 관리

   - 안전한 비밀번호 생성규칙 적용

   - 정보통신망을 통한 비밀번호 전송시 암호화 하거나 암호화된 통신 채널을 이용해서 전송

   - 비밀번호 저장 시 솔트와 함께 해시함수 적용, 해시함수 적용은 서버에서 수행해야 함

   - 비밀번호 변경 시 이전 비밀번호를 사용하지 않도록 하고 비밀번호 분실에 대한 안전한 재설정 방법을 적용

   - 비밀번호 변경 주기를 정의해서 만료시 변경되도록하고, 계정도용 여부 확인을 위해 마지막 성공한 로그인 시간 정보 알리기

 

4)  중요 자원 접근 통제

   - 중요 자원이나 기능에 대한 접근 통제 정책을 수립하여 적용

   - 관리자 페이지에 대한 접근 통제 정책을 수립하여 적용

 

5) 암호키 관리

   - DB내 데이터 암호화에 사용되는 암호키는 안전한 관리방법을 적용

      암호키는 데이터가 저장되는 DB와 물리적으로 분리된 장소에 보관

      암호키의 생명주기 관리 정책 정의

      비밀번호나 암호키는 메모리에 저장하지 않고 메모리에 저장해야하는 경우 사용종료 후 메모리 초기화

      암호키 새성 및 변경시 암호키 백업기능 구현

      대칭키 암호화에 사용되는 비밀키의 송신자 사용기간은 최대 2년, 수신자 사용기간은 최대 5년으로 설정

      공개키 암호화에 사용되는 공개키 최대 2년, 복호화 개인키 최대 2년, 검증 공개키 최소 3년, 서명용 개인키 최대 3년으로 설정

 

6) 암호 연산

   - 안전성이 보장되는 암호키 길이와 암호알고리즘 확인하여 적용

      양방향 대칭키 AES, SEEDM ARIA 등, 암호키 길이는 128비트 이상

      양방향 공개키 암호화 알고리즘 RSA로 공개키 길이는 2048비트 이상

   - 일방향 암호화를 위한 해시함수 사용시 안전한 해시함수와 솔트값 적용, 키 길이는 SHA-256이상

   - 난수를 생성해야 하는 경우 안전한 난수생성 알고리즘 사용

     시드를 재설정할 수 없는 위험한 java.Math.random함수 대신 java.util.Random 또는 java.security.SecureRandom 사용

 

7) 중요 정보 저장

   - 중요 정보 혹은 개인정보는 암호화해서 저장

   - 중요 정보가 메모리에 남지 않도록 사용 후 메모리 초기화 처리

 

8) 중요정보 전송

   - 인증 정보 등 민감한 정보를 전송하거나 개인정보를 전송할 경우 암호화하여 전송해야 함

   - 쿠키에 중요정보가 포함될 경우 암호화하여 전송

 

 

* 에러 처리 및 세션 통제 관련 보안 고려 사항

 

1) 예외 처리

   - 명시적 예외인 경우 예외처리 구문을 이용해서 예외 발생시 수행되어야 하는 기능 구현

   - 입력값에 따라 예외가 발생 가능한 경우 서비스가 정상동작할 수 있도록 입력값의 범위를 체크

   - 에러 발생 시 지정된 페이지를 사용자에게 제공하되 에러 메세지를 통해 중요정보가 제공되지 않도록 함

 

2) 세션 통제

   - 멀티스레드 환경에서의 컨트롤러 컴포넌트내 멤버 변수나 싱글톤객체의 클래스 변수처럼 세션간 데이터가 공유되는 변수 안쓰기

   - 세션이 안전하게 관리되돋록 설계

      웹사이트의 모든 페이지에서 로그아웃이 가능하도록 하기

      로그아웃 시 세션을 무효화 처리

      서비스의 특성에 맞게 세션 타임아웃시간 설정

      서비스 리스크에 따라 중복 로그인 허용여부 결정, 중복 로그인 발생 시 처리방안 정의

     세션 id가 포함된 쿠키에 대해 setHttpOnly 및 setSecure설정

     사용자가 패스워드를 변경하는 시점에 세션을 삭제하고 재할당

   - 세션 ID가 안전하게 관리되도록 설계

     세션 ID 최소 128비트 이상의 길이로 안전한 난수알고리즘을 사용하여 예측불가능하도록 생성

     애플리케이션에서 직접 부여하도록 개발자가 구현하는 방식 대신 WAS등의 미들웨어에서 제공하는 세션 생성 및 관리 기능 사용

     URL rewrite를 사용할 경우 세션 ID가 URL에 노출될 수 있으므로 사용하지 않음

     로그인 성공시 세션 ID를 재할당하고 주기적으로 세션 ID 재할당