멤버 자격 보안

Visual Studio 2010

업데이트: 2007년 11월

ASP.NET 멤버 자격은 사용자를 관리 및 인증하는 데 필요한 기능을 제공하며 주로 Login, LoginView, LoginStatus, LoginName, PasswordRecoveryCreateUserWizard 컨트롤 같은 폼 인증 및 인증 컨트롤에 사용됩니다. 이 항목에서는 최선의 웹 사이트 구성 및 멤버 자격 클래스 코딩 방법을 통해 멤버 자격 기능의 보안을 최적화하는 방법에 대해 설명합니다.

이러한 최선의 방법을 따르면 응용 프로그램의 보안을 향상시킬 수 있지만 Microsoft Windows 및 IIS(인터넷 정보 서비스)용 최신 보안 패치를 비롯해 Microsoft SQL Server 또는 다른 멤버 자격 데이터 소스를 위한 모든 패치를 사용하여 응용 프로그램 서버를 항상 최신 상태로 유지하는 것도 중요합니다.

안전한 코드 작성 및 응용 프로그램 보안을 위한 최선의 방법에 대한 자세한 내용은 Michael Howard 및 David LeBlanc이 공동으로 저술한 책인 "Writing Secure Code"와 Microsoft Patterns and Practices(http://www.microsoft.com/resources/practices/default.mspx)에서 제공하는 지침을 참조하십시오.

멤버 자격 기능은 ASP.NET 응용 프로그램에서 기본적으로 활성화되어 있으며 비활성화할 수 없습니다. 기본 구성 설정은 가장 안전한 값으로 설정되어 있습니다. 멤버 자격 구성 설정 및 기본값에 대한 내용은 membership 요소(ASP.NET 설정 스키마)을 참조하십시오. requiresQuestionAndAnswer 특성은 true로 설정해야 하며 특히, enablePasswordReset 또는 enablePasswordRetrievaltrue인 경우 그래야 합니다.

구성 값 보안

응용 프로그램의 구성 파일에 중요한 정보를 저장할 때는 보호되는 구성을 사용하여 중요한 값을 암호화해야 합니다. 이 중에서도 특히 중요한 정보에는 machineKey 구성 요소에 저장되는 암호화 키와 connectionStrings 구성 요소에 저장되는 데이터 소스 연결 문자열이 포함됩니다. 자세한 내용은 보호되는 구성을 사용하여 구성 정보 암호화를 참조하십시오.

보안 암호화 키 및 해시

멤버 자격 데이터 소스의 사용자 암호를 암호화할 때는 Hashed 또는 Encrypted로 설정된 passwordFormat 특성을 사용하는 것이 좋으며 이 경우 가장 안전한 형식은 Hashed입니다. 지정한 암호화 알고리즘의 암호화 키 값은 machineKey 구성 요소에 저장되어 있습니다. 강력한 암호화를 위해 선택한 암호화 알고리즘에 대해 적절한 길이의 임의로 생성된 값을 암호화 키로 지정합니다.

여러 응용 프로그램을 호스팅하는 서버에는 각 응용 프로그램마다 고유한 암호화 키를 정의하는 것이 좋습니다. 이보다 다소 안전성이 떨어지는 대안은 단일 암호화 키를 정의하고 이 키로 IsolateApps 옵션을 지정하는 것입니다.

호스트 서버의 컴퓨터 구성을 설정하여 응용 프로그램에서 구성 설정을 재정의하지 못하도록 할 수 있습니다. 여기에는 응용 프로그램의 Web.config 파일에서 암호화 키를 다시 정의하는 기능을 거부하는 설정이 포함됩니다.

연결 문자열

데이터베이스 서버의 연결을 안전하게 유지하려면 보호되는 구성을 사용하여 구성의 연결 문자열 정보를 암호화해야 합니다. 자세한 내용은 보호되는 구성을 사용하여 구성 정보 암호화를 참조하십시오.

통합 보안을 사용하여 SQL Server에 연결

연결 문자열이 손상되고 사용자 ID와 암호가 노출되지 않도록 하려면 통합 보안을 사용하여 SQL Server를 실행하는 컴퓨터에 연결해야 합니다. 연결에 통합 보안을 사용하도록 지정하여 SQL Server를 실행하는 컴퓨터에 연결하면 멤버 자격 기능에 프로세스 ID가 표시됩니다. 응용 프로그램 풀과 같이 ASP.NET을 실행하는 프로세스 ID는 기본 프로세스 계정이거나 제한된 사용자 계정이어야 합니다. 자세한 내용은 ASP.NET 가장을 참조하십시오.

SQL Server 데이터베이스 권한

멤버 자격의 사용자 정보를 저장하는 데 사용하는 SQL Server 데이터베이스에는 사용자가 필요한 기능 및 표시에만 액세스하도록 제한할 수 있는 데이터베이스 역할 및 뷰가 포함되어 있습니다. SQL Server 멤버 자격 데이터베이스에 연결하는 사용자 ID에는 필요한 최소한의 권한을 할당해야 합니다. 자세한 내용은 SQL Server용 응용 프로그램 서비스 데이터베이스의 역할 및 뷰를 참조하십시오.

SQL Server Express 작업자 프로세스 ID

SQL Server Express 2005에는 연결 사용자의 ID로 작업자 프로세스의 실행을 시작할 수 있는 새 작업 모드가 포함되어 있습니다. 이 기능을 "다음 사용자 이름으로 실행" 모드라고 합니다. 이 작업 모드는 IIS를 사용하는 데스크톱 개발에 적합하지만 신뢰할 수 없는 여러 고객 코드베이스를 호스팅하는 웹 서버에서는 작업자 프로세스를 시작하지 않는 것이 좋습니다. 서로 신뢰하지 않는 응용 프로그램이 포함된 공유 호스팅 서버는 "다음 사용자 이름으로 실행" 기능을 명시적으로 해제해야 합니다. osql –E –S .\sqlexpress 등의 SQL Express 인스턴스에 연결하고 다음 Transact-SQL 명령을 실행하면 이 기능을 해제할 수 있습니다.

EXEC sp_configure 'show advanced option', '1'

GO

RECONFIGURE WITH OVERRIDE

GO

EXEC sp_configure 'user instances enabled', 0

GO

RECONFIGURE WITH OVERRIDE

GO

로그온 페이지 같이 중요한 데이터를 사용하는 응용 프로그램 페이지는 표준 웹 보안 메커니즘을 사용하여 보호해야 합니다. SSL(Secure Sockets Layer)을 사용하고 사용자 정보 업데이트나 사용자 삭제 같은 중요한 작업을 수행할 때 사용자 로그온을 요구하는 등의 방법으로 이러한 페이지를 보호할 수 있습니다.

또한 페이지에 암호 및 일부 경우에는 사용자 이름 같은 중요한 기능 데이터가 일반 텍스트로 노출되어서는 안 됩니다. 이러한 정보를 표시하는 페이지는 SSL을 사용하고 인증된 사용자만 사용할 수 있도록 해야 합니다. 또한 중요한 기능 데이터를 쿠키에 저장하거나 안전하지 않은 연결을 통해 보내지 않도록 합니다.

업데이트 또는 대형 검색 작업을 수행하는 메서드를 여러 클라이언트가 동시에 호출하면 멤버 자격 데이터 소스의 응답 기능이 저하될 수 있습니다. 서비스 거부 공격에 대한 노출을 줄이려면 데이터베이스 업데이트 또는 검색 메서드를 사용하는 ASP.NET 페이지에는 관리 권한이 있는 사용자만 액세스할 수 있도록 제한하고 일반적인 용도로 유효성 검사 및 암호 관리를 제공하는 ASP.NET 페이지만 노출합니다.

예외

중요한 정보가 원하지 않는 대상에 노출되지 않도록 하려면 응용 프로그램에서 자세한 오류 메시지를 표시하지 않거나 클라이언트가 웹 서버일 경우에만 자세한 오류 메시지를 표시하도록 구성합니다. 자세한 내용은 customErrors 요소(ASP.NET 설정 스키마)를 참조하십시오.

이벤트 로그

서버에서 Windows Server 2003을 실행 중인 경우 이벤트 로그를 보호하고 이벤트 로그의 크기, 보존 등과 관련된 매개 변수를 설정하여 이에 대한 간접적인 서비스 거부 공격을 막음으로써 응용 프로그램의 보안을 향상시킬 수 있습니다.

상태 모니터링

성공 및 실패한 로그온 시도는 ASP.NET 상태 모니터링 기능을 통해 기록됩니다. 기본 구성에서 로그인에 실패하면 사용자 이름 및 기타 진단 정보가 응용 프로그램 이벤트 로그에 기록됩니다. 이 정보의 보안을 유지하려면 이벤트 로그에 대한 액세스를 제한해야 합니다.

사용자 지정 멤버 자격 공급자를 만들 경우 데이터베이스 작업을 수행할 때 SQL 삽입 등의 공격을 방지하도록 최선의 보안 방법을 따라야 합니다. 또한 사용자 지정 멤버 자격 공급자를 사용할 때는 최선의 보안 방법으로 공급자를 검토했는지 확인합니다.

SQL Server 멤버 자격 공급자나 사용자 지정 멤버 자격 공급자를 사용하는 경우 culture 구분 형식으로 멤버 자격 데이터를 저장하도록 데이터 소스를 구성할 수 있습니다. 그러나 ASP.NET에서는 멤버 자격 데이터 저장소의 사용자 이름과 권한 부여 구성 요소의 사용자 이름을 평가할 때 culture를 고려하지 않습니다. 따라서 사용자 이름을 culture 고정으로 취급하는 경우 해당 이름이 권한이 있는 사용자의 이름과 동일하게 취급되어 권한이 없는 사용자가 권한을 부여받을 수 있습니다.

권한이 없는 사용자가 무단으로 액세스하지 못하게 하려면 culture 고정으로 평가할 때 사용자 이름이 고유해야 합니다. 또는 권한 부여 구성 요소를 사용하여 권한 부여를 위한 역할 이름만 지정한 다음 culture 고정으로 평가할 때 역할 이름이 고유한지 확인할 수도 있습니다. 역할 만들기와 관리를 관리 기능으로 제한할 수 있으므로 일반적으로 역할 이름을 사용하여 권한 부여를 지정하는 것이 좋습니다.

표시: