セキュリティサポートプロバイダ (SSP) の列挙

Windows では Kerberos, NTLM 等様々なセキュリティの仕組みを利用できるように設計されています。Windows はそれぞれのセキュリティ機能を、セキュリティパッケージとして実装しています。

そして、セキュリティパッケージを利用する DLL のことをセキュリティ・サポート・プロバイダ (SSP) と呼ばれます。

例えばあなたのプログラムで Windows の Kerberos の機能を利用することにしたとします。その時に、セキュリティ実装部分としてその機能を DLL として実装したとします。そのDLL のことを セキュリティ・サポート・プロバイダ (SSP) といいます。

SSPを実装する方法として、Windows API ではセキュリティ・サポート・プロバイダ・インターフェイス (Security Support Provider Interface, SSPI) を定義しています。

言い換えれば、SSPI を通して、Windows が実装する各種のセキュリティパッケージを利用することが出来るのです。

さて、セキュリティ・パッケージはカスタムで実装することも可能です。そのため独自プロトコルによる認証を行う場合には、カスタムのセキュリティパッケージを実装することによって、それを実現することも可能です。(もちろん、非常に単純な認証機構であり、他のプログラムにそれを利用させることを想定しないような場合は、わざわざセキュリティ・パッケージを実装する必要はありません)

現在、システムにどのようなセキュリティパッケージがインストールされているか調べるためには、EnumerateSecurityPackages API を利用することが可能です。

下記のコードを参考にしてください。

#define SECURITY_WIN32

#include <stdio.h>
#include <windows.h>
#include <sspi.h>
#include <tchar.h>


#define CAPABILITIES_FLAG_CHECK(x, y) if(spi.fCapabilities & SECPKG_FLAG_##x) \
  { _tprintf(TEXT(y)); }


///////////////////////////////////////////////////////////////////////////////


void DumpPackageInfo(SecPkgInfo spi) {

     _tprintf (TEXT("=================================================\n"));
     _tprintf(TEXT("[%s]\n"), spi.Name); 
     _tprintf(TEXT("Capabilities: \n"));
     CAPABILITIES_FLAG_CHECK(INTEGRITY,                  "  INTEGRITY         |\n");
     CAPABILITIES_FLAG_CHECK(PRIVACY,                     "  PRIVACY           |\n");
     CAPABILITIES_FLAG_CHECK(TOKEN_ONLY,              "  TOKEN_ONLY        |\n");
     CAPABILITIES_FLAG_CHECK(DATAGRAM,                  "  DATAGRAM          |\n");
     CAPABILITIES_FLAG_CHECK(CONNECTION,              "  CONNECTION        |\n");
     CAPABILITIES_FLAG_CHECK(MULTI_REQUIRED,        "  MULTI_REQUIRED    |\n");
     CAPABILITIES_FLAG_CHECK(CLIENT_ONLY,              "  CLIENT_ONLY       |\n");
     CAPABILITIES_FLAG_CHECK(EXTENDED_ERROR,       "  EXTENDED_ERROR    |\n");
     CAPABILITIES_FLAG_CHECK(IMPERSONATION,          "  IMPERSONATION     |\n");
     CAPABILITIES_FLAG_CHECK(ACCEPT_WIN32_NAME, "  ACCEPT_WIN32_NAME |\n");
     CAPABILITIES_FLAG_CHECK(STREAM, "  STREAM\n");     
     _tprintf(TEXT("Version:       %d\n"), spi.wVersion);
     _tprintf(TEXT("RPC ID:        %d\n"), spi.wRPCID);
     _tprintf(TEXT("MaxToken size: %u\n"), spi.cbMaxToken);
     _tprintf(TEXT("Comment:       %s\n"), spi.Comment);

}


///////////////////////////////////////////////////////////////////////////////


int main(int argc, char* argv[]) {

     ULONG cPackages;
     PSecPkgInfo pPackageInfo;

     SECURITY_STATUS ss = EnumerateSecurityPackages(
          &cPackages,
          &pPackageInfo
     );

     if( SEC_E_OK != ss ) {
          return 1;
     }

     for(ULONG i=0; i<cPackages; i++) {

          DumpPackageInfo(pPackageInfo[i]);
     
     }

     FreeContextBuffer(pPackageInfo);

     return 0;
}

makefile は次の通りです。このままビルドするには上記ファイルを EnumSecPkg.cpp という名前で保存してください。

TARGETNAME=enumsecpkg
OUTDIR=.\chk
LINK32=link.exe

ALL : "$(OUTDIR)\$(TARGETNAME).exe"

CPPFLAGS=\
	/nologo\
	/MT\
	/W4\
	/Fo"$(OUTDIR)\\"\
	/Fd"$(OUTDIR)\\"\
	/c\
	/Zi\
	/DWIN32\
	/DUNICODE\
	/D_UNICODE\
		
LINK32_FLAGS=\
	Secur32.lib\
	/nologo\
	/subsystem:console\
	/pdb:"$(OUTDIR)\$(TARGETNAME).pdb"\
	/machine:I386\
	/out:"$(OUTDIR)\$(TARGETNAME).exe"\
	/DEBUG
	
LINK32_OBJS= \
	"$(OUTDIR)\$(TARGETNAME).obj"

"$(OUTDIR)\$(TARGETNAME).exe" : "$(OUTDIR)" $(LINK32_OBJS)
    $(LINK32) $(LINK32_FLAGS) $(LINK32_OBJS)

"$(OUTDIR)" :
    @if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"


.cpp{$(OUTDIR)}.obj:
   $(CPP) $(CPPFLAGS) $<

EnumerateSecurityPackages API の結果、私の環境では次のようなセキュリティパッケージがインストールされていることがわかります。

> enumsecpkg
=================================================
[Negotiate]
Capabilities:
  INTEGRITY         |
  PRIVACY           |
  CONNECTION        |
  MULTI_REQUIRED    |
  EXTENDED_ERROR    |
  IMPERSONATION     |
  ACCEPT_WIN32_NAME |
Version:       1
RPC ID:        9
MaxToken size: 12256
Comment:       Microsoft Package Negotiator
=================================================
[Kerberos]
Capabilities:
  INTEGRITY         |
  PRIVACY           |
  TOKEN_ONLY        |
  DATAGRAM          |
  CONNECTION        |
  MULTI_REQUIRED    |
  EXTENDED_ERROR    |
  IMPERSONATION     |
  ACCEPT_WIN32_NAME |
Version:       1
RPC ID:        16
MaxToken size: 12000
Comment:       Microsoft Kerberos V1.0
=================================================
[NTLM]
Capabilities:
  INTEGRITY         |
  PRIVACY           |
  TOKEN_ONLY        |
  CONNECTION        |
  MULTI_REQUIRED    |
  IMPERSONATION     |
  ACCEPT_WIN32_NAME |
Version:       1
RPC ID:        10
MaxToken size: 2888
Comment:       NTLM Security Package
=================================================
[Schannel]
Capabilities:
  INTEGRITY         |
  PRIVACY           |
  CONNECTION        |
  MULTI_REQUIRED    |
  EXTENDED_ERROR    |
  IMPERSONATION     |
  ACCEPT_WIN32_NAME |
  STREAM
Version:       1
RPC ID:        14
MaxToken size: 24576
Comment:       Schannel Security Package
=================================================
[Microsoft Unified Security Protocol Provider]
Capabilities:
  INTEGRITY         |
  PRIVACY           |
  CONNECTION        |
  MULTI_REQUIRED    |
  EXTENDED_ERROR    |
  IMPERSONATION     |
  ACCEPT_WIN32_NAME |
  STREAM
Version:       1
RPC ID:        14
MaxToken size: 24576
Comment:       Schannel Security Package
=================================================
[WDigest]
Capabilities:
  TOKEN_ONLY        |
  IMPERSONATION     |
  ACCEPT_WIN32_NAME |
Version:       1
RPC ID:        21
MaxToken size: 4096
Comment:       Digest Authentication for Windows
=================================================
[TSSSP]
Capabilities:
  CONNECTION        |
  MULTI_REQUIRED    |
  ACCEPT_WIN32_NAME |
Version:       1
RPC ID:        22
MaxToken size: 13000
Comment:       TS Service Security Package
=================================================
[CREDSSP]
Capabilities:
  INTEGRITY         |
  PRIVACY           |
  CONNECTION        |
  MULTI_REQUIRED    |
  IMPERSONATION     |
  ACCEPT_WIN32_NAME |
  STREAM
Version:       1
RPC ID:        65535
MaxToken size: 37032
Comment:       Microsoft CredSSP Security Provider

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説