secure coding guidelines
이 자습서에서는 보안 코딩, 보안 관련 취약성을 방지하는 방법을 설명하고 보안 코딩 관행을위한 코딩 지침 및 체크리스트를 제공합니다.
소프트웨어에 보안을 구축하고 보안 코딩 지침 및 모범 사례를 구현하려면 전체 조직과 의도 된 응용 프로그램 개발 작업을 담당하는 팀이 특정 측면을 고려해야합니다.
여기에서는 보안 소프트웨어를 개발하는 데 도움이되는 측면에 대해 설명합니다.
개발자가 의미를 모르는 경우만큼 간단합니다. '소프트웨어 보안' 해커가 소프트웨어를 해킹하고, 제어하고, 악용을 시도하는 방법은 보안 소프트웨어를 코딩하는 것이 불가능합니다. 따라서 개발자는 먼저 Secure Coding의 의미를 이해해야합니다.
학습 내용 :
보안 코딩이란?
보안 코딩은 소프트웨어를 설계하고 개발하는 것입니다. 약점 피하기 지정된 보안 표준 및 업계 모범 사례를 준수하여 보안 관련 취약성을 유발합니다.
모든 사람의 마음에서 가장 먼저 떠오르는 질문은 '소프트웨어에 필요한 보안 수준' 또는 소프트웨어가 안전하다고 언제 말할 수 있습니까? 과 그 보안 표준은 무엇입니까 ?
사기와 보안 위협은 날로 증가하고 있으며, 소위 가장 안전한 소프트웨어에서도 새로운 종류의 해킹 방법과 해킹 방법을 목격하고 있습니다.
최근 우리는 UIDAI의 Aaadhar 프로그램이 개인 데이터를 조작하는 것을 들었습니다. 따라서 소프트웨어와 관련된 위협을 이해하고 비즈니스에 대한 위험을 기준으로 우선 순위를 지정하지 않으면 소프트웨어에 필요한 보안 수준과 보안 표준이 무엇인지 알기가 정말 어렵습니다.
소프트웨어에 100 % 보안 보호를 제공하는 것은 어려울 수 있지만 프로그램 팀이 위험 및 증권 소프트웨어에 관련된 잠재적 인 위협과 팀이 이러한 위험을 완화 할 수 있다면 애플리케이션의 보안 지점에서 좋을 것입니다.
따라서 팀의 첫 번째 작업은 애플리케이션에 관련된 위험과 증권을 식별 및 분석하고 가능한 완화 옵션을 이해하고 그에 따라 최상의 옵션을 채택하는 것입니다.
따라서 상위 10 개 취약점을 식별하면 프로그램이 직면 할 가능성이있는 거의 모든 공격을 분류합니다. 이렇게하면 위협을 이해하고 완화보다 예방에 대한 보안 및 개발 노력의 우선 순위를 정하는 데 도움이됩니다.
예 : 개인의 건강 데이터와 개인 정보를 처리하고 저장하는 의료 관련 앱을 개발할 계획이지만 애플리케이션의 가장 큰 보안 위험은 개인 건강 데이터를 훔치는 것입니다.
위험 완화
위험을 완화하기 위해
- 권한없는 사용자의 데이터 액세스를위한 보안 구현은 적절한 인증 및 권한 부여 (강력한 암호 정책 구현, 2 단계 인증)로 처리되어야합니다.
- 데이터 전송의 보안 채널 (HTTPS)을 구현하고 전송 중 데이터 암호화를 구현하여 한 소스에서 다른 소스로 데이터를 전송하는 동안 데이터 유출이 없도록주의해야합니다.
- 미사용 데이터를 변조하거나 훔치는 것도 또 다른 가능성입니다. 따라서 개인 건강 데이터 저장 (암호화 사용)은 매우 중요합니다.
'Secure Coding Standard'로 이동하기 전에 항상 전체 프로그램 팀이 ‘보안 인식 세션’ 토론하고 브레인 스토밍합니다.
- 특정 제품에 대한 보안 요구 사항.
- 해커가 시스템을 해킹하면 얻을 수있는 이점.
- 애플리케이션의 보안 손상 가능한 방법 및 수단.
- 유사한 산업 및 도메인에서 공통 보안 관행을 따랐습니다.
- 각 프로그램의 일반적인 보안 문제에 대한 이해.
또한 팀이 이해할 수 있다면 더 잘 처리하는 데 도움이됩니다. 취약점의 원인 그들의 소프트웨어가 직면 할 수있는 것과 소프트웨어가 구축되는 이유 나쁨 / 부적절 보안 .
부적절한 보안 구현의 이유
일반적으로 다음은 응용 프로그램에서 부적절한 보안 구현에 대한 몇 가지 이유입니다.
- 보안 측면보다 기능 릴리스에 우선 순위가 부여됩니다.
- 소프트웨어 보안 및 해커에 대한 무지 또는 인식 없음.
- 프로그램 또는 소프트웨어 디자인 자체에 대한 명확성이 충분하지 않습니다.
- 프로그램의 복잡성.
- 충분하지 않은 데이터, 배포 될 라이브 시스템에 대한 정보.
- SDLC 단계에서 보안을 고려하지 않습니다.
- 소프트웨어에 사용 된 언어의 특성에 대한 지식과 이해가 부족합니다.
- 보안 코딩 지침에 대해 팀과 개발자에게 충분한 지식이 없습니다.
모든 개발자와 테스터가 응용 프로그램의 보안을 알고있는 것은 아니며 특히 작업중인 응용 프로그램에 대한 보안 취약성 및 악용에 대해 심층적으로 이해하지 못할 수 있다는 것을 알고 있습니다. 일반적으로 그들은 익숙 할 것입니다. ‘기능적으로 코딩하는 방법’ 하지만 그들 모두가 '안전하게 코딩하는 방법'을 아는 것은 아닙니다.
따라서 조직이 소프트웨어에 Secure Coding Practices를 채택하는 데있어 매우 중요한 측면은 ‘사람 교육’ . 따라서 보안 코딩 측면, 최상의 보안 코딩 관행 및 올바른 도구 사용에 대해 팀을 교육하는 것은 매우 중요합니다.
소프트웨어 보안의 가장 중요한 설계 원칙은 다음과 같습니다. ‘설계 및 기본 보안 구현’ .
보안 코딩 지침
보안을 달성하려면 '시큐어 코딩 표준' 응용 프로그램 개발 초기에 프로그램에 대해 식별되어 팀이 소프트웨어의 보안 기본값을 관리하고 공격으로부터 보호하는 데 도움이됩니다.
전체 팀이 이 표준을 준수하도록 강제 , 코딩 언어 및 프로그램에서 사용하는 도구에 관계없이.
다음은 보안 코드 디자인에서 기본적으로 구현해야하는 몇 가지 예입니다.
- 액세스는 인증 된 사용자로만 제한되어야하며 인증은 모든 계층에서 구현되어야합니다.
- 인증 토큰을 보호하려면 통신 채널을 암호화해야합니다.
- 모든 키, 암호 및 인증서를 적절하게 저장하고 보호해야합니다.
- 파일 암호화, 데이터베이스 암호화 및 데이터 요소 암호화를 구현해야합니다.
보안 코딩을위한 언어 선택
코딩을위한 언어 선택은 보안 코딩에 의존하지 않을 수 있습니다. 보안 소프트웨어를 빌드하기위한 코딩을위한 보안 또는 보안되지 않은 언어만큼 특별한 것은 없습니다.
프로그래밍 언어를 사용하여 소프트웨어를 구축하는 방법과 개발자가 보안 측면을 구현할 때 코딩 언어에 대해 얼마나 심층적 인 지식을 가지고 있는지입니다.
그러나 분명히 보안 코딩 표준은 언어 선택과 무관하며 보안 코드 모범 사례는 언어와 플랫폼에 따라 다르며 구현에 따라 다릅니다. .
따라서 보안 코드를 가지려면 개발자가 프로그램에서 사용되는 언어에 대한 심층적 인 지식을 가지고 있어야 보안 모범 사례를 쉽게 구현할 수 있습니다.
예:
- 버퍼 오버플로 취약점의 가능성은 언어마다 다르지만 C, C ++ 및 Assembly는 오래된 메모리 관리 기능으로 인해 가장 취약한 것으로 간주됩니다. strcpy () 및 memcpy ()와 같은 여러 표준 C lib 함수는 버퍼 오버플로 공격에 취약합니다. 이러한 함수를 잘못 사용하면 너무 커서 대상 버퍼에 맞지 않는 소스 버퍼를 복사하면 버퍼 오버플로가 발생합니다.
- Java 기반 웹 애플리케이션의 일반적인 문제는 파일, 소켓 및 데이터베이스 연결과 같은 개방형 시스템 리소스로 인해 발생할 수있는 리소스 누출 가능성입니다.
보안의 다음 측면은 사용할 도구 응용 프로그램에서 다음과 같은 도구를 사용하여 보안을 최적화합니다. 통합 개발 환경 그들은 많은 것을 제공하기 때문에 가장 유익 할 것입니다 경고 소프트웨어의 품질을 개선하기 위해 이러한 경고에주의를 기울이십시오.
- Eclipse, Spring Tool Suite, RAD와 같은 상용 또는 오픈 소스 라이브러리 / 플러그인을 IDE와 통합하면 개발자가 잠재적으로 취약한 코드를 탐지 및 식별하여 보안 코드를 작성할 수 있으며 악성 파일 실행, 정보 유출 및 관련 발견에 대한 경고를 제공합니다. 부적절한 오류 처리.
또한 사용하는 것이 필수적입니다 정적 및 동적 분석기 소프트웨어의 보안 측면을 개선합니다. 일반적으로 정적 분석기는 특정 유형의 오류에 최적화되어 있으므로 특정 오류를 식별하면서 많은 수의 오 탐지를 발견하게됩니다. 때로는 실제 오류도 놓칠 가능성이 있습니다.
따라서 사용하는 것이 좋습니다 여러 정적 분석기 다양한 유형의 오류를 더 잘 다루고 많은 오탐을 피할 수 있습니다. 때로는 수행하는 것이 좋습니다 수동 테스트 ...에 오 탐지 제거 .
보안 코딩 규칙 및 권장 사항
프로그램이 다음의 세트를 정의하는 것이 좋습니다. '보안 코딩 규칙 및 권장 사항' 소스 코드의 준수 여부를 평가하여 테스터가 ‘적합성 준수 테스트’ 이러한 보안 코딩 표준 각각에 대해.
따라서 보안 코드는 설정된 벤치 마크에 대한 해당 규칙을 사용하여 준수 또는 비준수로 인증 될 수 있습니다.
아래에 언급 된 몇 가지 규칙을 사용하여 보안 위반을 확인할 수 있습니다.
- 더 이상 필요하지 않은 파일은 닫아야합니다.
- 경계를 넘어 구조를 통과 할 때마다 정보 유출을 방지해야합니다.
- 객체는 적절한 저장 기간으로 선언해야합니다.
따라서 이러한 규칙을 확인하는 테스트 케이스는 적합성 준수를 확인하기 위해 설계 및 수행되어야합니다. 또한 대부분의 취약점은 일반적인 프로그래밍 오류로 인해 발생하는 것으로 확인되었습니다.
따라서 개발자는 '안전하지 않은 코딩 방법' , 그들은 또한 보안 코딩의 모범 사례를 배웁니다. 코딩하는 동안 처리 할 수 있도록 애플리케이션의 보안 취약성에 기여하는 가장 일반적인 프로그래밍 오류를 수집하는 것이 이상적입니다.
이러한 일반적인 프로그래밍 오류는 주로 버퍼 오버플로, 교차 사이트 스크립팅 및 주입 결함으로 인해 발생합니다.
일반적인 프로그래밍 취약점 중 일부는 다음과 같습니다.
- SQL 주입 (SQL 명령에 사용 된 특수 요소의 부적절한 무효화).
- 정수 오버플로.
- 버퍼 오버플로 (입력 크기를 확인하지 않고 버퍼 복사).
- 제어되지 않는 형식 문자열입니다.
- 인증 및 권한이 없습니다 (잘못된 권한).
- 민감한 데이터 노출.
- 부적절한 오류 처리.
이러한 오류 중 일부는 시스템 충돌, 시스템에 대한 예기치 않은 액세스 및 해커의 소프트웨어 제어 손실로 이어질 수 있습니다.
피해야 할 일반적인 프로그래밍 오류
피해야 할 일반적인 프로그래밍 오류는 다음과 같습니다.
- SQL 명령에 사용 된 특수 요소의 부적절한 무효화 (‘SQL 주입’).
- 입력 크기를 확인하지 않고 버퍼 복사 (‘Classic Buffer Overflow’).
- 중요 기능에 대한 인증이 없습니다.
- 누락되거나 잘못된 승인.
- 하드 코딩 된 자격 증명 사용.
- 민감한 데이터의 암호화 누락.
- 위험한 유형의 파일 무제한 업로드.
- 보안 결정에서 신뢰할 수없는 입력에 대한 의존.
- 불필요한 권한으로 실행.
- CSRF (Cross-Site Request Forgery).
- 무결성 검사없이 코드 다운로드.
- 버퍼 크기 계산이 잘못되었습니다.
- 과도한 인증 시도에 대한 부적절한 제한.
- 신뢰할 수없는 사이트로의 URL 리디렉션 (‘Open Redirect’).
- 제어되지 않는 형식 문자열입니다.
- 솔트없이 단방향 해시 사용.
보안 코드 실행을위한 체크리스트
마지막으로 보안 소프트웨어 개발 측면에서 위의 모든 사항을 고려한 후 개발자는 다음 사항을 따라야합니다. 보안 코드 실행을위한 체크리스트 놓치는 일이 없도록합니다. 아래에 몇 가지가 있지만 완전한 목록은 아닙니다.
입력 유효성 검사 :
- 입력을 신뢰하지 말고 중앙 집중식 입력 유효성 검사를 고려하십시오.
- 클라이언트 측 유효성 검사에 의존하지 마십시오.
- 정규화 문제에주의하십시오.
- 입력을 제한, 거부 및 삭제합니다. 유형, 길이, 형식 및 범위를 확인합니다.
입증:
- 익명, 식별 및 인증 된 영역별로 사이트를 분할합니다.
- 강력한 암호를 사용하십시오.
- 암호 만료 기간 및 계정 비활성화를 지원합니다.
- 자격 증명을 저장하지 마십시오 (솔트와 함께 단방향 해시 사용).
- 인증 토큰을 보호하기 위해 통신 채널을 암호화합니다.
- HTTPS 연결을 통해서만 양식 인증 쿠키를 전달합니다.
권한 부여:
- 최소 권한 계정을 사용하십시오.
- 권한 부여 세분성을 고려하십시오.
- 권한 분리를 시행합니다.
- 시스템 수준 리소스에 대한 사용자 액세스를 제한합니다.
- 인증 및 승인에 OAuth 2.0 프로토콜을 사용합니다.
- API 유효성 검사 수행.
- 허용되는 방법을 허용 목록에 추가합니다.
- 권한있는 작업과 민감한 리소스 컬렉션을 보호합니다.
- CSRF (교차 사이트 리소스 위조)로부터 보호합니다.
세션 관리 :
C ++ 삽입 정렬 코드
- 서버에서 세션 식별자를 만듭니다.
- 로그 오프로 세션을 종료합니다.
- 재 인증시 새 세션을 생성합니다.
- TLS를 통해 전송되는 쿠키에 대해 '보안'속성을 설정합니다.
암호화 :
- '전송중인 데이터, 저장중인 데이터, 이동중인 데이터, 메시지 무결성'동안 암호화를 사용합니다.
- 자신을 개발하지 마십시오. 검증 된 플랫폼 기능을 사용하십시오.
- 암호화되지 않은 데이터를 알고리즘에 가깝게 유지하십시오.
- 올바른 알고리즘과 키 크기를 사용하십시오.
- 키 관리를 피하십시오 (DPAPI 사용).
- 주기적으로 키를 순환하십시오.
- 제한된 위치에 키를 보관하십시오.
로깅 및 감사 :
- 악의적 인 행동을 식별합니다.
- 좋은 트래픽이 어떤지 알 수 있습니다.
- 모든 애플리케이션 계층을 통해 활동을 감사하고 기록합니다.
- 로그 파일에 대한 보안 액세스.
- 로그 파일을 백업하고 정기적으로 분석하십시오.
출력 인코딩 :
- '입력 유효성 검사 (XML, JSON….)'를 수행합니다.
- 매개 변수화 된 쿼리를 사용합니다.
- '스키마 유효성 검사'를 수행합니다.
- 인코딩 (XML, JSON ..)을 수행합니다.
- 보안 헤더를 보냅니다.
참고: ' OWASP 보안 코딩 관행 체크리스트 (요약, SCP 체크리스트) '
보안 코딩 체크리스트의 표 형식 요약
아래 표는 ‘보안 코드를 위해 기억해야 할 사항’ 응용 프로그램의.
# | 뭐? |
---|---|
7 | 전체 팀이 보안 코딩 표준을 준수하도록 강제합니다. |
1 | 명확하게 이해하려면 '보안 코드 란 무엇입니까?' |
두 | 일반적인 '취약점의 원인'을 이해합니다. |
삼 | 팀에 대한 '보안 인식 세션'을 진행합니다. |
4 | 신청과 관련된 '위험 및 증권'과 '완화'방법을 파악하고 분석합니다. |
5 | 보안 코딩 표준, 모범 사례 및 지침에 대한 '팀 교육'. |
6 | '보안 코딩 표준'을 정의하려면 |
8 | 'Easy to Implement Language'를 사용하고 그것에 대한 '심층 지식'을 갖습니다. |
9 | IDE (통합 개발 환경) 도구를 사용하려면 |
10 | '정적 및 동적 분석기'및 '다중 정적 분석기'를 사용하여 '거짓 양성'제거 |
열한 | 오류를 식별하는 데 필요한 모든 곳에서 '수동 테스트'를 수행하려면 놓치십시오. |
12 | '보안 코딩 규칙 및 권장 사항'집합을 정의하려면 |
13 | 설정된 규칙에 대한 '적합성 준수 테스트'를 수행합니다. |
14 | '안전하지 않은 코딩 방법'을 이해하고 '일반적인 프로그래밍 오류'를 수집합니다. |
열 다섯 | 'SCP 체크리스트'를 엄격히 준수하려면 |
결론
이 튜토리얼이 소프트웨어 보안을 보장하는 최고의 가이드가되기를 바랍니다.
보안 소프트웨어 개발을위한 코딩 지침은 개념을 쉽게 이해할 수 있도록 예제와 함께 간단한 용어로 여기에 나열되어 있습니다.
행복한 독서 !!
추천 도서
- 보안 테스트 (전체 가이드)
- 2021 년 최고의 30 대 사이버 보안 기업 (중소기업 수준의 기업)
- 초보자를위한 컴퓨터 프로그래밍의 기초 | 코딩 튜토리얼
- 완벽한 코딩 경험을위한 최고의 15 가지 최고의 무료 코드 편집기
- SQL 주입 테스트 자습서 (SQL 주입 공격의 예 및 방지)
- 개발자는 좋은 테스터가 아닙니다. 뭐라고?
- ISTQB Foundation 시험 형식 및 논문 해결 지침
- 모바일 앱 보안 테스트 지침