SAMLシングル・サインオンの構成

WLSTを使用して、WebLogic ServerドメインでSAMLシングル・サインオン(SSO)を有効にします。

WebLogicドメインでSAML SSOを有効にする場合は、セキュリティ・プロバイダまたは認証プロバイダ、SAML 2.0全般サービスを構成し、ドメインのロールに応じてIDプロバイダ・サービスまたはサービス・プロバイダ・サービスを構成する必要があります。WebLogicでSAML SSOを構成する一般的なプロセスの詳細は、『Oracle WebLogic Serverセキュリティの管理』SAML 2.0サービスの構成に関する項を参照してください。

パートナ・プロパティのインポート

WLSTオフラインを使用してSAML SSOを構成する前に、フェデレーテッド・パートナのメタデータ・ファイルをエクスポートし、IDプロバイダ・パートナのプロパティ・ファイルまたはサービス・プロバイダ・パートナのプロパティ・ファイルを作成して、両方のファイルをDOMAIN_HOME/securityディレクトリに配置する必要があります。

  1. WSLTオンラインを使用して、フェデレーテッド・パートナからメタデータ・ファイルをエクスポートします。WLSTオフラインでは、メタデータのエクスポートはサポートされていません。

  2. パートナ・プロパティ・ファイルを作成します。

    • WebLogic ServerをIDプロバイダとして使用する場合は、ファイルを作成し、saml2sppartner.propertiesという名前を付けます。次の例をリファレンスとして使用します。#で始まるプロパティはオプションです。

      saml2.sp.partners=401kPartner,hmoPartner
      401kPartner.metadata.file=401ksp_metadata.xml 
       
      hmoPartner.metadata.file=hmosp_metadata.xml
      # hmoPartner.enabled=true
      # hmoPartner.description=
      # hmoPartner.mapperClassname=
      # hmoPartner.wantAssertionsSigned=false
      # hmoPartner.timeToLive=100
      # hmoPartner.timeToLiveOffset=50
      # hmoPartner.generateAttributes=false
      # hmoPartner.keyInfoIncluded=false
      # hmoPartner.includeOneTimeUseCondition=false
    • WebLogic Serverをサービス・プロバイダとして使用する場合は、ファイルを作成し、saml2idppartner.propertiesという名前を付けます。次の例をリファレンスとして使用します。#で始まるプロパティはオプションです。

      saml2.idp.partners=company1Partner,company2Partner
      company1Partner.description=Company1 IDP Partner
      company1Partner.metadata.file=company1idp_metadata.xml
      company1Partner.enabled=true
      company1Partner.redirectUris=/company1app/target.jsp,/company1app/index.jsp 
       
      company2Partner.metadata.file=company2idp_metadata.xml
      company2Partner.redirectUris=/company2app/target.jsp,/company2app/welcome.jsp
      company2Partner.issuerUri=
      company2Partner.enabled=true
      company2Partner.virtualUserEnabled=true
      # company2Partner.mapperClassname=com.bea.security.saml2.providers.SAML2IdentityAsserterNameMapper
      # company2Partner.wantAssertionsSigned=false
      # company2Partner.processAttributes=false
  3. パートナ・メタデータ・ファイルおよびパートナ・プロパティ・ファイルをDOMAIN_HOME/securityディレクトリに保存します。

サンプル: SAML SSOによるIDプロバイダ・サイトとしてのWebLogic Serverの構成

このサンプルWLSTスクリプトを開始点として使用して、IDプロバイダとして機能するWebLogic ServerインスタンスでSAML 2.0シングル・サインオン(SSO)を構成する独自のスクリプトを作成します。

ノート:

WLSTオフラインを使用してSAML SSOを構成する場合は、サービス・プロバイダ・パートナのプロパティ・ファイルを作成する必要があります。このプロパティ・ファイルは、フェデレーテッド・パートナに必要な重要なSAML 2.0パートナ・メタデータを指定します。パートナ・プロパティ・ファイルの詳細は、「パートナ・プロパティのインポート」を参照してください。

例C-1 IDプロバイダ・サイトとしてのWebLogic Serverの構成とSAML SSOの有効化

プレースホルダ・テキストを実際の値で更新します。プレースホルダ・テキストは@記号で囲みます。たとえば、@admin_username@などです。

def getEnvVar(var):
  val=os.environ.get(var)
  if val==None:
    print "ERROR: Env var ",var, " not set."
    sys.exit(1)
  return val

# Configure SAML2 Credential Mappers
def configSAML2CM():
 cd('/SecurityConfiguration/@domainName@/Realms/@realmName@')
 create('@saml2CMName@', 'com.bea.security.saml2.providers.SAML2CredentialMapper', 'CredentialMapper')
 cd('CredentialMappers')
 cd('@saml2CMName@')
 cmo.setIssuerURI('@url@/company1idp_entityid')

# Configure SAML1.1 V2 Credential Mappers
def configSAML11V2CM():
 cd('/SecurityConfiguration/@domainName@/Realms/@realmName@')
 create('@samlV2CMName@', 'weblogic.security.providers.saml.SAMLCredentialMapperV2', 'CredentialMapper')
 cd('CredentialMappers')
 cd('@samlV2CMName@')
 cmo.setIssuerURI('@url@/company1idp_saml11issuer')
 cmo.setNameQualifier('company1idp_saml11namequalifier')

# Configure SAML2 SSO Service
def configSSOService(AdminServerName):
 cd('/Server')
 cd(AdminServerName)
 create(AdminServerName, 'SingleSignOnServices')
 cd('SingleSignOnServices')
 cd(AdminServerName)
 cmo.setContactPersonGivenName('company1ContactPersonGivenName')
 cmo.setContactPersonSurName('company1ContactPersonSurName')
 cmo.setContactPersonType('technical')
 cmo.setContactPersonCompany('company1ContactPersonCompany')
 cmo.setContactPersonTelephoneNumber('company1ContactPersonTelephoneNumber')
 cmo.setContactPersonEmailAddress('company1ContactPersonEmailAddress')
 cmo.setOrganizationName('company1OrganizationName')
 cmo.setOrganizationURL('company1OrganizationURL')
 cmo.setEntityID('@url@/company1idp_entityid')
 cmo.setPublishedSiteURL('@url@/saml2')
 cmo.setLoginURL('@url@/loginapp/loginapp.jsp')
 cmo.setIdentityProviderPOSTBindingEnabled(true)
 cmo.setIdentityProviderArtifactBindingEnabled(true)
 cmo.setIdentityProviderRedirectBindingEnabled(true)
 cmo.setIdentityProviderPreferredBinding('HTTP/POST')
 cmo.setSSOSigningKeyAlias('company1IdPSSOSigningKeyAlias')
 ssoSigningKeyPassPhraseEncrypted=encrypt('company1IdPSSOSigningKeyPassPhrase', '@domainPath@')
 cmo.setSSOSigningKeyPassPhraseEncrypted(ssoSigningKeyPassPhraseEncrypted)

 twoWaySSLEnabled='@twoWaySSLEnabled@'
 if twoWaySSLEnabled == 'true':
         cmo.setTransportLayerSecurityKeyAlias('company1IdPTLSKeyAlias')
         transportLayerSecurityKeyPassPhraseEncrypted=encrypt('company1IdPTLSKeyPassPhrase', '@domainPath@')
         cmo.setTransportLayerSecurityKeyPassPhraseEncrypted(transportLayerSecurityKeyPassPhraseEncrypted)

 cmo.setIdentityProviderEnabled(true)

# Configure SAML1.1 Federation Service
def configFedService(AdminServerName):
 cd('/Server')
 cd(AdminServerName)
 create(AdminServerName, 'FederationServices')
 cd('FederationServices')
 cd(AdminServerName)
 cmo.setSourceSiteURL('@url@/company1idp_saml11')
 cmo.setSigningKeyAlias('company1IdPSSOSigningKeyAlias')
 signingKeyPassPhraseEncrypted=encrypt('company1IdPSSOSigningKeyPassPhrase', '@domainPath@')
 cmo.setSigningKeyPassPhraseEncrypted(signingKeyPassPhraseEncrypted)

 isUsingHTTPS='@isUsingHTTPS@'
 twoWaySSLEnabled='@twoWaySSLEnabled@'
 if isUsingHTTPS == 'true':
         cmo.setITSRequiresSSL(true)
         cmo.setARSRequiresSSL(true)
         if twoWaySSLEnabled == 'true':
                 cmo.setARSRequiresTwoWaySSL(true)
 else:
         cmo.setITSRequiresSSL(false)
         cmo.setARSRequiresSSL(false)

 cmo.setSourceSiteEnabled(true)

# Configure SSL
def configSSL(AdminServerName):
 cd('/Servers')
 cd(AdminServerName)
 cmo.setKeyStores('CustomIdentityAndCustomTrust')
 cmo.setCustomTrustKeyStoreFileName('@certsDir@/company1IdPTrust.jks')
 customTrustKeyStorePassPhraseEncrypted=encrypt('company1IdPTrustKeyStorePassPhrase', '@domainPath@')
 cmo.setCustomTrustKeyStorePassPhraseEncrypted(customTrustKeyStorePassPhraseEncrypted)
 cmo.setCustomIdentityKeyStoreFileName('@certsDir@/company1IdPIdentity.jks')
 customIdentityKeyStorePassPhraseEncrypted=encrypt('company1IdPIdentityKeyStorePassPhrase', '@domainPath@')
 cmo.setCustomIdentityKeyStorePassPhraseEncrypted(customIdentityKeyStorePassPhraseEncrypted)

 create(AdminServerName, 'SSL')
 cd('/Servers/' + AdminServerName + '/SSL')
 cd(AdminServerName)
 cmo.setEnabled(true)
 cmo.setListenPort(int('@sport@'))
 cmo.setTwoWaySSLEnabled(Boolean('@twoWaySSLEnabled@'))
 cmo.setClientCertificateEnforced(Boolean('@clientCertificateEnforced@'))
 cmo.setHostnameVerificationIgnored(false)
 cmo.setServerPrivateKeyAlias('company1IdPServerKeyAlias')
 serverPrivateKeyPassPhraseEncrypted=encrypt('company1IdPServerKeyPassPhrase', '@domainPath@')
 cmo.setServerPrivateKeyPassPhraseEncrypted(serverPrivateKeyPassPhraseEncrypted)

# Optional: Create cluster

# Create IDP domain

readDomain('@domainPath@')
configSAML2CM()
configSSOService('@adminServerName@')

# configSAML11V2CM()
configFedService('@adminServerName@')
configSSL('@adminServerName@')

updateDomain()
closeDomain()
print 'Domain Updated with Identity Provider configured'

exit()

サンプル: SAML SSOによるサービス・プロバイダ・サイトとしてのWebLogic Serverの構成

このサンプルWLSTスクリプトを開始点として使用して、サービス・プロバイダとして動作するWebLogic ServerインスタンスでSAML 2.0シングル・サインオン(SSO)を構成する独自のスクリプトを作成します。

ノート:

WLSTオフラインを使用してSAML SSOを構成する場合は、IDプロバイダ・パートナのプロパティ・ファイルを作成する必要があります。このプロパティ・ファイルは、フェデレーテッド・パートナに必要な重要なSAML 2.0パートナ・メタデータを指定します。パートナ・プロパティ・ファイルの詳細は、「パートナ・プロパティのインポート」を参照してください。

例C-2 サービス・プロバイダ・サイトとしてのWebLogic Serverの構成とSAML SSOの有効化

プレースホルダ・テキストを実際の値で更新します。プレースホルダ・テキストは@記号で囲みます。たとえば、@admin_username@などです。

def getEnvVar(var):
  val=os.environ.get(var)
  if val==None:
    print "ERROR: Env var ",var, " not set."
    sys.exit(1)
  return val

# Create domain
def createDomain(domainName, adminServerName):
  readTemplate('@templateJar@')
  set('Name', domainName)
  setOption('DomainName', domainName)
  cd('/Servers/AdminServer')
  set('ListenPort', '@admin_port@')
  set('Name', adminServerName)
  cd('/Security/' + domainName + '/User/weblogic')
  cmo.setName('@admin_username@')
  cmo.setPassword('@admin_password@')
  setOption('OverwriteDomain', 'true')
  writeDomain('@domainPath@')
  closeTemplate()
  print 'Domain Created'

# Create a cluster
def createCluster(clusterName):
  cd('/')
  cl=create(clusterName, 'Cluster')
  cluster_type='@cluster_type@'
  number_of_ms=int('@number_of_ms@')
  managed_server_name_base='@managed_server_name_base@'
  managed_server_name_base_svc='@managed_server_name_base_svc@'

  if cluster_type == "CONFIGURED":
    for index in range(0, number_of_ms):
      cd('/')
      msIndex = index+1
      name = managed_server_name_base + msIndex
      name_svc = managed_server_name_base_svc + msIndex
      create(name, 'Server')
      cd('/Servers/' + name + '/')
      print('managed server name is ' + name)
      set('ListenPort', '@server_port@')
      set('NumOfRetriesBeforeMSIMode', 0)
      set('RetryIntervalBeforeMSIMode', 1)
      set('Cluster', clusterName)

  else:
    print('Configuring Dynamic Cluster ' +  clusterName)
    templateName = '@cluster_name@-template'
    print('Creating Server Template: ' + templateName)
    st1=create(templateName, 'ServerTemplate')
    print('Done creating Server Template: ' + templateName)
    cd('/ServerTemplates/' + templateName)
    cmo.setListenPort('@server_port@')
    cmo.setCluster(cl)
    print('Done setting attributes for Server Template: ' + templateName);
    cd('/Clusters/' + clusterName)
    create(clusterName, 'DynamicServers')
    cd('DynamicServers/' + clusterName)
    set('ServerTemplate', st1)
    set('ServerNamePrefix', managed_server_name_base)
    set('DynamicClusterSize', number_of_ms)
    set('MaxDynamicClusterSize', number_of_ms)
    set('CalculatedListenPorts', false)

  print('Done setting attributes for Dynamic Cluster: ' + clusterName);

# Configure SAML Authentication Provider
def configSAMLAtn():
  cd('/SecurityConfiguration/@domainName@/Realms/@realmName@')
  samlatn = create('@samlAtnName@', 'weblogic.security.providers.saml.SAMLAuthenticator', 'AuthenticationProvider')
  samlatn.setControlFlag('SUFFICIENT')

# Configure SAML2 Identity Asserter
def configSAML2IA():
  cd('/SecurityConfiguration/@domainName@/Realms/@realmName@')
  create('@saml2IAName@', 'com.bea.security.saml2.providers.SAML2IdentityAsserter', 'AuthenticationProvider')
  cd('AuthenticationProvider')
  cd('@saml2IAName@')
  # cmo.setReplicatedCacheEnabled(Boolean('@replicatedCacheEnabled@'))

def reConfigDefaultAtn():
  cd('/SecurityConfiguration/@domainName@/Realms/@realmName@')
  delete('DefaultAuthenticator', 'AuthenticationProvider')
  delete('DefaultIdentityAsserter','AuthenticationProvider')
  defaultAtn=create('DefaultAuthenticator', 'weblogic.security.providers.authentication.DefaultAuthenticator', 'AuthenticationProvider')
  defaultAtn.setControlFlag('REQUIRED')
  create('DefaultIdentityAsserter', 'weblogic.security.providers.authentication.DefaultIdentityAsserter', 'AuthenticationProvider')

# Configure SAML1.1 V2 Identity Asserter
def configSAML11V2IA():
  cd('/SecurityConfiguration/@domainName@/Realms/@realmName@')
  create('@saml11IAName@', 'weblogic.security.providers.saml.SAMLIdentityAsserterV2', 'AuthenticationProvider')
  cd('AuthenticationProvider')
  cd('@saml11IAName@')

# Configure SAML2 SSO Service
def configSSOService(AdminServerName):
 cd('/Server')
 cd(AdminServerName)
 create(AdminServerName, 'SingleSignOnServices')
 cd('SingleSignOnServices')
 cd(AdminServerName)
 cmo.setContactPersonGivenName('401kContactPersonGivenName')
 cmo.setContactPersonSurName('401kContactPersonSurName')
 cmo.setContactPersonType('technical')
 cmo.setContactPersonCompany('401kContactPersonCompany')
 cmo.setContactPersonTelephoneNumber('401kContactPersonTelephoneNumber')
 cmo.setContactPersonEmailAddress('401kContactPersonEmailAddress')
 cmo.setOrganizationName('401kOrganizationName')
 cmo.setOrganizationURL('401kOrganizationURL')
 cmo.setEntityID('@url@/401ksp_entityid')
 cmo.setPublishedSiteURL('@url@/saml2')
 cmo.setServiceProviderPOSTBindingEnabled(true)
 cmo.setServiceProviderArtifactBindingEnabled(true)
 cmo.setServiceProviderPreferredBinding('HTTP/POST')
 cmo.setSSOSigningKeyAlias('401kSPSSOSigningKeyAlias')
 ssoSigningKeyPassPhraseEncrypted=encrypt('401kSPSSOSigningKeyPassPhrase', '@domainPath@')
 cmo.setSSOSigningKeyPassPhraseEncrypted(ssoSigningKeyPassPhraseEncrypted)

 twoWaySSLEnabled='@twoWaySSLEnabled@'
 if twoWaySSLEnabled == 'true':
         cmo.setTransportLayerSecurityKeyAlias('401kSPTLSKeyAlias')
         transportLayerSecurityKeyPassPhraseEncrypted=encrypt('401kSPTLSKeyPassPhrase', '@domainPath@')
         cmo.setTransportLayerSecurityKeyPassPhraseEncrypted(transportLayerSecurityKeyPassPhraseEncrypted)

 cmo.setServiceProviderEnabled(true)
 print "SP Service configured."

# Configure SAML1.1 Federation Service
def configFedService(AdminServerName):
 cd('/Server')
 cd(AdminServerName)
 create(AdminServerName, 'FederationServices')
 cd('FederationServices')
 cd(AdminServerName)
 isUsingHTTPS='@isUsingHTTPS@'
 if isUsingHTTPS == 'true':
         cmo.setACSRequiresSSL(true)
 else:
         cmo.setACSRequiresSSL(false)
 cmo.setDestinationSiteEnabled(true)

# Configure Keystores
def configSSL(AdminServerName):
 cd('/Servers')
 cd(AdminServerName)
 cmo.setKeyStores('CustomIdentityAndCustomTrust')
 cmo.setCustomTrustKeyStoreFileName('@certsDir@/401kSPTrust.jks')
 customTrustKeyStorePassPhraseEncrypted=encrypt('401kSPTrustKeyStorePassPhrase', '@domainPath@')
 cmo.setCustomTrustKeyStorePassPhraseEncrypted(customTrustKeyStorePassPhraseEncrypted)
 cmo.setCustomIdentityKeyStoreFileName('@certsDir@/401kSPIdentity.jks')
 customIdentityKeyStorePassPhraseEncrypted=encrypt('401kSPIdentityKeyStorePassPhrase', '@domainPath@')
 cmo.setCustomIdentityKeyStorePassPhraseEncrypted(customIdentityKeyStorePassPhraseEncrypted)
 
 create(AdminServerName, 'SSL')
 cd('/Servers/' + AdminServerName + '/SSL')
 cd(AdminServerName)
 cmo.setEnabled(true)
 cmo.setListenPort(int('@sport@'))
 cmo.setTwoWaySSLEnabled(Boolean('@twoWaySSLEnabled@'))
 cmo.setClientCertificateEnforced(Boolean('@clientCertificateEnforced@'))
 cmo.setHostnameVerificationIgnored(false)
 cmo.setServerPrivateKeyAlias('401kSPServerKeyAlias')
 serverPrivateKeyPassPhraseEncrypted=encrypt('401kSPServerKeyPassPhrase', '@domainPath@')
 cmo.setServerPrivateKeyPassPhraseEncrypted(serverPrivateKeyPassPhraseEncrypted)

# Open the existing domain and configure SP
createDomain = '@createDomain@'
createCluster = '@createCluster@'

if createDomain == 'true':
  createDomain('@domainName@', '@adminServerName@')

readDomain('@domainPath@')
if createCluster == 'true':
  createCluster('@clusterName@')

configSAMLAtn()
configSAML2IA()
reConfigDefaultAtn()
configSSOService('@adminServerName@')
configFedService('@adminServerName@')
configSSL('@adminServerName@')

updateDomain()
closeDomain()
print 'Domain Updated with Service Provider Configured'

exit()