セキュリティサポートプロバイダ (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