다음을 통해 공유


대규모 멀티 플레이어 온라인 게임에 대한 설치 모범 사례

이 문서에서는 Windows 및 Windows Vista 및 Windows 7의 보안 모델과 잘 작동하는 MMOG(대규모 멀티 플레이어 온라인 게임) 클라이언트 설치 및 사용자 지정 게임 업데이트 시스템을 위한 신뢰 체인을 만드는 방법을 설명합니다. 이 방법은 하드 드라이브 및 시스템 레지스트리에 대한 액세스가 제한된 표준 사용자 계정을 지원하면서 MMOG 타이틀의 패치를 사용하도록 설계되었습니다.

MMOG 클라이언트가 기존 소매 구매 게임과 다른 요구 사항이 있는 이유

MMOG의 지속적으로 연결되고 진화하는 특성으로 인해 보안 취약성을 해결하고 게임 플레이 환경을 확장하기 위해 클라이언트 코드 및 콘텐츠의 정기적인 업데이트를 제공하는 것이 기본 요구 사항입니다. 거의 매일 업데이트할 가능성이 있으므로 MMOG 시나리오에서는 사용자에게 친숙한 환경을 보장하기 위해 신중한 관리가 필요합니다. 이는 제품의 소매 배송 날짜에 가까운 소수의 패치가 제공될 수 있는 기존의 소매 구매 모델과 다릅니다. 운영 체제와 함께 제공되는 Windows Installer 제한된 사용자 패치 기술은 MMOG에 필요한 대량 및 고주파가 아니라 적은 수의 애플리케이션 패치를 처리하도록 설계되었습니다. 따라서 개발 중인 특정 MMOG와 관련된 특별한 요구 사항을 포함하여 MMOG의 요구를 해결하기 위해 사용자 지정 패치 시스템을 개발해야 하는 경우가 많습니다.

인터넷에 연결된 컴퓨터가 너무 많기 때문에 Windows Vista 및 Windows 7에는 사용자에 대한 보안 제한 및 보호가 강화되어 애플리케이션이 하드 드라이브의 다양한 영역에 액세스하도록 제한합니다. Windows XP와 달리 이러한 제한은 사용자 계정에 대한 기본 모드에 대해 사용하도록 설정됩니다. 이러한 제한 사항은 게임, 실행 파일 및 데이터 및 관련 패치 시스템의 레이아웃을 디자인할 때 고려해야 합니다. 운영 체제에서 제공하는 보안 조치에 대한 자세한 내용은 게임 개발자용 사용자 계정 컨트롤을 참조 하세요.

신뢰 체인 접근 방식 개요

이 백서에 제시된 사용자 지정 업데이트 접근 방식은 게임 실행 파일 및 데이터를 모든 사용자가 액세스할 수 있는 공유 영역에 유지하면서 보호된 Program Files 폴더에 신뢰할 수 있는 로더 애플리케이션을 설치하는 것을 기반으로 합니다. 신뢰 체인은 시작하기 전에 게임 이진 파일 및 데이터에 대한 유효성 검사를 수행하는 로더로 시작합니다.

트러스트 체인이 신뢰할 수 있는 로더로 시작됩니다.

신뢰할 수 있는 로더는 게임을 시작하기 전에 게임의 실행 파일 및 기타 이진 파일이 변조되지 않았는지 확인할 수 있는 충분한 논리가 있어야 합니다. 로더는 필요한 만큼 자주 게임 데이터를 확인할 수도 있지만, 일반적으로 게임 데이터의 크기가 너무 커서 한 번의 패스로 매번 확인할 수 없습니다. 다른 방법은 전체 데이터 집합의 확인이 장기간에 걸쳐 수행되도록 하는 샘플링 패턴을 사용하는 것입니다. 로더 애플리케이션은 설치된 게임과 업데이트를 통합하여 신뢰할 수 있는 방법을 제공하는 게임 패치 엔진을 포함할 수 있습니다.

서버에서 모든 항목의 유효성이 검사됩니다. 클라이언트가 해킹당하면 걱정해야 하는 이유는 무엇인가요?

클라이언트가 손상되지 않았다고 신뢰할 수는 없습니다. 따라서 MMOG 서버는 클라이언트에서 받은 모든 데이터의 유효성을 검사하는 것이 일반적입니다. 이 처리는 게임 우주 내에서 손상된 게임 클라이언트 또는 부정 행위 게임 클라이언트를 식별할 수 있지만 서버는 게임 클라이언트가 노출될 수 있는 모든 문제를 쉽게 식별할 수 없습니다. 클라이언트를 서비스, 다른 사용자 또는 단순히 클라이언트 머신 자체를 공격하기 위한 벡터로 공격하기 위한 플랫폼으로 사용하려는 해커로부터 보호를 강화하는 것이 중요합니다. 코드 서명 및 데이터 확인 기술을 적용하면 손상된 클라이언트가 실행되기 전에 검색하는 데 도움이 될 수 있습니다. 패치 메커니즘을 사용하려면 Program Files에 대한 표준 읽기 전용 권한으로 보호되지 않는 실행 파일 및 DLL 이진 파일을 노출해야 하므로 이러한 파일을 시작하기 전에 유효성을 검사하는 것이 전반적인 시스템 보안에 중요합니다.

이 모델은 로더 자체가 손상될 수 있는 악의적인 관리자 사용자 시나리오를 처리하려고 시도하지 않지만 실수로 변조된 코드를 실행하지 않도록 표준 사용자를 보호하는 데 중점을 둡니다. 기존의 서버-클라이언트 유효성 검사 기술은 악의적인 클라이언트 시스템 관리자에게 가능한 유일한 완화 방법입니다.

신뢰할 수 있는 로더 애플리케이션 생성

배경 읽기

독자는 소프트웨어 기반 신뢰에 대한 모범 사례를 보장하기 위한 기초 기술에 대한 세부 정보를 제공하는 다음 설명서를 숙지해야 합니다.

코드 서명

게임 개발자를 위한 Authenticode 서명

SignTool

MSDN의 SignTool

다음 섹션에서는 신뢰 확인의 설치 및 확인을 위해 디스크 레이아웃을 지원하는 로더 애플리케이션을 생성하는 데 사용해야 하는 API에 대해 자세히 설명합니다.

신뢰할 수 있는 로더 및 패처 설치

신뢰할 수 있는 로더 및 기본 버전의 패처 유틸리티는 기존 설치와 마찬가지로 HDD의 보호된 Program Files 폴더 아래에 설치해야 합니다. 로더 애플리케이션의 설치 및 패치에는 관리자 권한이 필요하므로 최종 사용자가 자주 상승하지 않아도 되도록 로더에 대한 업데이트 빈도를 최소화하는 것이 중요하지만, Windows Installer 제한된 사용자 패치를 사용하여 로더 패치에 대한 권한 상승을 방지할 수 있습니다.

Windows XP, Windows Vista 및 Windows 7에서 게임 소프트웨어 패치 문서를 참조하세요.

게임 실행 파일, DLL 및 데이터 설치

관리 권한 없이 게임의 표준 사용자 업데이트를 용이하게 하려면 모든 사용자가 액세스할 수 있는 쓰기가 가능한 하드 디스크 영역에 게임 실행 파일, DLL 및 데이터를 설치해야 합니다. 운영 체제는 설치의 기본 위치로 사용할 수 있는 "모든 사용자 애플리케이션 데이터" 영역을 제공합니다. 이 영역에 대한 파일 경로를 확인하려면 SHGetFolderPath 를 CSIDL_COMMON_APPDATA 키와 함께 사용해야 합니다. 사용자가 구성할 수 있으므로 이 키가 반환되는 경로에 대해 가정하지 않는 것이 중요합니다.

타이틀 업데이트에 필요한 모든 사용자 공유-쓰기 액세스 권한을 얻으려면 설치에서 폴더 권한을 변경하거나 관리해야 합니다. 올바른 사용 권한으로 로더 프로그램의 게임 업데이트 프로그램 기능은 표준 사용자가 시작한 시간을 포함하여 모든 사용자 계정의 특별한 권한 없이도 게임을 쉽게 패치할 수 있습니다.

Access Control 목록 수정 코드

Windows XP의 경우 코드를 실행하여 ACL(액세스 제어 목록)을 수동으로 변경해야 합니다. 이 작업을 수행하는 방법을 보여 주는 예제 함수는 다음과 같습니다.

HRESULT ChangeACLtoAllowUserRW( WCHAR* strDir )
{
    EXPLICIT_ACCESS explicitaccess;
    PACL NewAcl = NULL;
    DWORD dwError;

    BuildExplicitAccessWithName( &explicitaccess, L"BUILTIN\\Users",
                                 GENERIC_ALL, GRANT_ACCESS,
                                 SUB_CONTAINERS_AND_OBJECTS_INHERIT );
                                 
    dwError = SetEntriesInAcl( 1, &explicitaccess, NULL, &NewAcl );
    if( dwError == ERROR_SUCCESS) 
    {
        dwError = SetNamedSecurityInfo( strDir, SE_FILE_OBJECT,
                                        DACL_SECURITY_INFORMATION,
                                        NULL, NULL, NewAcl, NULL );
        if( dwError == ERROR_SUCCESS)
        {
            if( NewAcl != NULL ) AccFree( NewAcl );
            return S_OK;
        }
    }

    if( NewAcl != NULL ) AccFree( NewAcl );
    return E_FAIL;
}

이 코드 예제는 Windows Vista 및 Windows 7에서도 작동합니다. 그러나 대신 사용하도록 선택할 수 있는 파일 ACLS를 편집하는 명령줄 유틸리티 icacls도 제공합니다.

이 도구는 실행할 때 자세한 도움말을 제공하지만 도구에 대한 한 가지 사용 예는 다음과 같습니다.

icacls "C:\Users\All Users\Game" /grant Rex:(D,WDAC)

이 사용은 사용자에게 하드 드라이브의 모든 사용자 영역에 저장된 게임 폴더에 대한 렉스 삭제 및 쓰기 DAC 권한을 부여합니다.

고급 사용자를 위한 설치

고급 사용자 설치 시나리오의 경우 사용자가 게임 설치 경로를 수동으로 지정할 수 있습니다. 폴더가 하드 드라이브의 진정한 공유 가능 영역에 있는지 확인하려면 디렉터리 선택을 프로그램 파일 외부로 제한해야 합니다. 사용자가 선택한 경로는 더 나은 보안을 위해 항상 보안 프로그램 파일 폴더 아래에 게임 로더 및 Patcher exes를 설치해야 하며 게임 exes 및 데이터에만 사용해야 합니다.

로더의 신뢰 확인

Windows는 서명된 코드의 유효성을 확인하기 위한 WinVerifyTrust 함수를 제공하며 운영 체제의 암호화 서비스를 기반으로 합니다. 함수는 MSDN: WinVerifyTrust 함수에 완전히 문서화되어 있습니다.

함수를 사용하여 프로그램 실행 파일이 유효한 인증서로 서명되었는지 여부를 확인하는 자세한 내용은 예제 C 프로그램: PE 파일의 서명 확인을 참조하세요.

서명된 게임 실행 파일이 로더 내에서 실행될 수 있는 신뢰할 수 있는지 확인하기 위해 일반 확인 작업으로 충분합니다.

Value

WINTRUST_ACTION_GENERIC_VERIFY_V2

의미

Authenticode 정책 공급자를 사용하여 파일 또는 개체를 확인합니다.

이 함수는 트러스트 공급자가 지정된 작업을 처리하는 데 필요한 정보를 포함하는 입력 구조 인수를 사용합니다. 일반적으로 앞의 예제와 같이 구조에는 트러스트 공급자가 평가해야 하는 개체를 식별하는 정보가 포함됩니다.

구조체의 형식은 작업 식별자에 따라 다릅니다. WinTrust 공급자의 예제 구조에 대한 자세한 내용은 WINTRUST_DATA Structure를 참조하세요.

트러스트 공급자가 지정된 작업에 대해 주체를 신뢰할 수 있는지 확인하면 반환 값은 0입니다. 0 이외의 다른 값은 성공적인 반환으로 간주해서는 안 됩니다.

데이터 유효성 검사

코드 서명 메커니즘은 실행 파일, DLL, Windows Installer 패키지(.msi 파일) 및 캐비닛(.cab) 파일을 비롯한 몇 가지 특정 형식의 파일에만 서명을 지원합니다. WinVerifyTrust API는 대용량 파일의 유효성을 검사할 때 성능 및 안정성에 몇 가지 문제가 있으므로 큰 데이터 파일(예: .cab 파일)이 변조되지 않았는지 확인하는 데 사용하면 안 됩니다. 프로그램 실행 파일은 WinTrust 공급자를 사용하여 완전 신뢰 검사가 수행될 만큼 충분히 작은 경향이 있지만 게임의 데이터 파일은 종종 크기가 많은 기가바이트 영역입니다. 로더가 게임 데이터 확인을 위해 사용하는 접근 방식은 게임 런타임 동안 데이터 세트의 작은 샘플을 테스트하는 방식이어야 합니다. 이 방법은 게임 플레이 환경의 수명 동안 검증 테스트 비용을 분산하고 긴 대기 시간 없이 원활한 사용자 환경을 제공할 수 있습니다. 이를 위해 데이터의 신중한 구성이 필요할 수 있습니다. 일부 MMOG는 시간이 지남에 따라 게임 자산의 정확성을 관리, 유지 관리 및 확인하는 데 도움이 되는 데이터베이스 접근 방식을 사용합니다.

보안 관점에서 클라이언트 코드는 신뢰할 수 있는 로더와 함께 일종의 기본 데이터 유효성 검사를 사용하는 경우에도 데이터 파일을 신뢰하지 않도록 설계되어야 합니다. 헤더 검사, 해시 및 기타 기존 무결성 검사를 사용해야 합니다. 클라이언트의 I/O 코드를 강화하는 작업은 퍼지 테스트와 같은 기술을 사용할 뿐만 아니라 Visual Studio 2005 및 Visual Studio 2008의 /analyze 스위치와 같은 자동 정적 코드 분석 도구(Visual Studio 팀 시스템 및 Windows SDK와 함께 제공되는 무료 컴파일러에서 사용 가능)를 활용하여 수행해야 합니다.

소프트웨어 보안에 대한 자세한 내용은 게임 개발의 모범 보안 사례를 참조하세요.