다음을 통해 공유


보안 코딩 지침

대부분의 애플리케이션 코드는 .NET에서 구현하는 인프라만 사용할 수 있습니다. 경우에 따라 보안 시스템을 확장하거나 새 임시 메서드를 사용하여 빌드된 추가 애플리케이션별 보안이 필요합니다.

코드에서 .NET 강제 사용 권한 및 기타 적용을 사용하면 악성 코드가 원하지 않는 정보에 액세스하거나 다른 바람직하지 않은 작업을 수행하지 못하도록 장벽을 세워야 합니다. 또한 신뢰할 수 있는 코드를 사용하는 모든 예상 시나리오에서 보안과 유용성 간의 균형을 유지해야 합니다.

이 개요에서는 코드가 보안 시스템에서 작동하도록 디자인할 수 있는 다양한 방법을 설명합니다.

리소스 액세스 보안

코드를 디자인하고 작성할 때 특히 알 수 없는 원본 코드를 사용하거나 호출할 때 코드가 리소스에 대한 액세스를 보호하고 제한해야 합니다. 따라서 코드가 안전한지 확인하기 위해 다음 기술을 염두에 두어야 합니다.

  • CAS(코드 액세스 보안)를 사용하지 마세요.

  • 신뢰할 수 있는 부분 코드를 사용하지 마세요.

  • AllowPartiallyTrustedCaller 특성(APTCA)을 사용하지 마세요.

  • .NET 원격을 사용하지 마세요.

  • DCOM(분산 구성 요소 개체 모델)을 사용하지 마세요.

  • 이진 포맷터를 사용하지 마세요.

코드 액세스 보안 및 Security-Transparent 코드는 부분적으로 신뢰할 수 있는 코드가 있는 보안 경계로 지원되지 않습니다. 대체 보안 조치를 마련하지 않고 알 수 없는 원본 코드를 로드하고 실행하지 않는 것이 좋습니다. 대체 보안 조치는 다음과 같습니다.

  • 가상화

  • 애플리케이션 컨테이너

  • 운영 체제(OS) 사용자 및 권한

  • Hyper-V 컨테이너

보안 중립적 코드

보안 중립적 코드는 보안 시스템에서 명시적인 작업을 수행하지 않습니다. 수신하는 모든 권한으로 실행됩니다. 보호된 작업(예: 파일, 네트워킹 사용 등)과 관련된 보안 예외를 catch하지 못하는 애플리케이션은 처리되지 않은 예외를 초래할 수 있지만 보안 중립적 코드는 여전히 .NET의 보안 기술을 활용합니다.

보안 중립적 라이브러리에는 이해해야 하는 특별한 특성이 있습니다. 라이브러리가 파일을 사용하거나 관리되지 않는 코드를 호출하는 API 요소를 제공한다고 가정합니다. 코드에 해당 권한이 없으면 설명된 대로 실행되지 않습니다. 그러나 코드에 사용 권한이 있더라도 코드를 호출하는 애플리케이션 코드는 작동하려면 동일한 권한이 있어야 합니다. 호출 코드에 올바른 권한이 없으면 코드 액세스 보안 스택 워크의 결과로 SecurityException가 표시됩니다.

재사용 가능한 구성 요소가 아닌 애플리케이션 코드

코드가 다른 코드에서 호출되지 않는 애플리케이션의 일부인 경우 보안이 간단하고 특수 코딩이 필요하지 않을 수 있습니다. 기억하세요, 그러나 악성 코드는 여러분의 코드를 호출할 수 있습니다. 코드 액세스 보안은 악성 코드가 리소스에 액세스하는 것을 막을 수 있지만 이러한 코드는 중요한 정보를 포함할 수 있는 필드 또는 속성의 값을 계속 읽을 수 있습니다.

또한 코드가 인터넷 또는 기타 신뢰할 수 없는 원본의 사용자 입력을 허용하는 경우 악의적인 입력에 주의해야 합니다.

네이티브 코드 구현에 대한 관리되는 래퍼

일반적으로 이 시나리오에서는 관리 코드에서 사용할 수 있도록 하려는 네이티브 코드에서 몇 가지 유용한 기능이 구현됩니다. 관리되는 래퍼는 플랫폼 호출 또는 COM interop을 사용하여 쉽게 작성할 수 있습니다. 그러나 이 작업을 수행하는 경우 래퍼의 호출자는 성공하려면 관리되지 않는 코드 권한이 있어야 합니다. 기본 정책에 따르면, 인트라넷 또는 인터넷에서 다운로드한 코드는 래퍼와 함께 작동하지 않습니다.

이러한 래퍼를 사용하는 모든 애플리케이션에 관리되지 않는 코드 권한을 부여하는 대신 래퍼 코드에만 이러한 권한을 부여하는 것이 좋습니다. 기본 기능이 리소스를 노출하지 않고 구현도 마찬가지로 안전한 경우 래퍼는 해당 권한만 어설션하면 되므로 모든 코드가 이를 통해 호출할 수 있습니다. 리소스가 관련된 경우 보안 코딩은 다음 섹션에 설명된 라이브러리 코드 사례와 동일해야 합니다. 래퍼가 잠재적으로 이러한 리소스에 호출자를 노출할 수 있으므로, 네이티브 코드의 안전성을 신중히 확인하는 것이 필요하며, 이는 래퍼의 책임입니다.

보호된 리소스를 노출하는 라이브러리 코드

다음 방법은 보안 코딩에 대해 가장 강력하고 위험할 수 있으므로(잘못 수행된 경우) 라이브러리는 .NET 클래스가 사용하는 리소스에 대한 권한을 적용하는 것처럼 다른 코드에서 사용할 수 없는 특정 리소스에 액세스하기 위한 인터페이스 역할을 합니다. 리소스를 노출하는 경우 코드는 먼저 리소스에 적절한 권한(즉, 보안 검사를 수행해야 합니다)을 요구한 다음 일반적으로 실제 작업을 수행할 권한을 어설션해야 합니다.

참고하십시오