SAML Integration with Web Applications Korean Access Federation https://www.kafe.or.kr support@kafe.or.kr
Revision History 일자 작성자 버전 비고 2018.02.06 장희진 1.0 2018.07.10 채영훈 2.0 2018.11.26 채영훈 2.1 2018.11.27 조진용 2.12 repackage 2018.11.28 채영훈 3.0 재구성 2019.07.12 조진용 3.01 재정리 2019.07.15 조진용 3.02 Shibboleth 추가 - 1 -
목 차 Chapter 1. Introduction 1. 개요 2 2. 기술프로파일 3 2.1 속성정보 3 Chapter 2. SAML Integration 1. Spring SAML for Java Web Applications 5 1.1 검증환경 5 1.2 메타데이터의구성 5 1.2.1 서비스제공자의메타데이터설정 5 1.2.2 Self-signed certificate의생성및설정 6 1.3 메타데이터의교환 8 1.3.1 시험용식별정보제공자의메타데이터를서비스제공자에등록 8 1.3.2 시험용식별정보제공자에서비스제공자의메타데이터등록 9 1.3.3 시험용식별정보제공자와서비스제공자의연동확인 12 1.4 웹응용과 Spring Security SAML의통합을위한상세기술설명 14 1.4.1 예제코드및프로젝트의구조 14 1.4.2 securitycontext.xml 15 1.4.3 사용자속성정보의활용 17 2. Shibboleth for Java Web Applications 18 2.1 yum을이용한 Shibboleth 설치및환경설정 18 2.1.1 사용자속성정보의활용 18 2.1.2 Shibboleth 설정 19 2.1.3 Shibboleth 설정확인 22 2.2 AJP 설정 23 2.2.1 AJP 패킷사이즈 23 2.2.2 Apache 설정 23 Chapter 3. 계정연합참여 1. 계정연합연동 24 1.1 Spring Security SAML 24-2 -
1.2 탐색서비스설정 26 1.2.1 Spring Security SAML 26-3 -
용어정의 연합인증계정연합 KAFE 식별정보제공자서비스제공자탐색서비스개체식별자 통합인증 (Single Sign On) 의확장된개념이다. 표준인증규약 (SAML) 을이용한다. Identity(ID) Federation, 서비스제공자와식별정보제공자의연합으로써동일한연합인증정책을준용한다. Korean Access Federation, 국내계정연합으로써국가과학기술연구망 (KREONET) 에서운영한다. Identity Provider, 사용자에게로그인기능을제공하고사용자를인증하는 SAML 개체로써일반적으로기관과조직을의미한다. Service Provider, 정보시스템 ( 웹응용등 ) 을제공하는 SAML 개체로써일반적으로웹기반응용서비스를의미한다. 식별정보제공자를선택할수있는서비스이다. 연합인증에는다수의식별정보제공자 ( 기관 ) 이포함되기때문에사용자는하나의식별정보제공자를선택해야한다. entityid, 서비스제공자또는식별정보제공자를가리키는고유식별자이다. https://fqdn/idp/simplesaml 등과같은방법으로표기한다. 메타데이터 SAML 개체의앤드포인트, 인증서등의정보를담고있는 XML 파일이다. 식별정보제공자와서비스제공자는메타데이터를교환해야서로통신이가능하다. 속성 Attribute, 사용자가갖는정보 ( 예, email, 이름등 ) 를의미한다. - 1 -
Chapter 1. Introduction 1. 개요 본문서는웹응용에 SAML(Security Assertion Markup Language) 소프트웨어를통합하는방법을기술한다. SAML은 XML 기반의국제표준보안인증규격으로써서비스제공자와식별정보제공자는 HTTP를이용해 SAML 메시지를교환한다. 연합인증에서서비스제공자와식별정보제공자는사용자의웹브라우저를이용해 SAML 메시지를교환한다. 서비스제공자에서식별정보제공자에게로그인을요청할때는 HTTP-Redirect, 식별정보제공자가서비스제공자에게로그인결과를전달할때는 HTTP-POST를사용하는것이일반적이다. 서비스제공자는 HTTP-POST 방식으로전달받은인증정보 ( 예, 언제누가로그인했으며로그인결과는성공 ) 와사용자속성정보 ( 예, 이메일, 이름, 직무정보등 ) 을이용해해당사용자를인가한다. 식별정보제공자 서비스제공자 (Identity Provider) (Service Provider) 로그인 ( 인증 ) 권한부여 ( 인가 ) SAML SAML 웹브라우저 (User client) 연합인증에서주로사용하는 SAML 소프트웨어와특징은다음과같다. Shibboleth simplesamlphp Spring Security SAML Apache 모듈로써 Web 서버와 Web 응용서버가분리된경우이용 PHP 라이브러리로웹응용이 PHP로구현된경우이용 Spring 프레임워크를이용하는웹응용의경우이용 SAML 처리웹서버 (Apache) Shibboleth 인증정보의전달 mod_jk, mod_ajp 웹응용서버 ( 예, Tomcat) Shibboleth를이용할경우, 연합인증과관련된기능은모두웹서버의 Shibboleth 모듈 (mod_shib) 에서처리한다. Shibboleth가획득한인증정보와속성정보는 mod_jk 또는 mod_ajp를이용해웹응용서버에전달되고웹응용서버는전달받은속성정보를이용해사용자를인가 (Authorization) 한다. 웹응용서버가 JEUS일경우에는 mod_jk를이용해속성정보를전달해야한다. - 2 -
웹서버 (Apache) 웹응용서버 ( 예, Tomcat) SAML Library 이용 Shibboleth를이용할수없는환경 ( 예, 웹서버가 WebtoB) 또는웹서버가존재하지않는환경이라면웹응용서버에설치될웹응용에 SAML 라이브러리를통합함으로써연합인증기능을처리케해야한다. 웹서버가 WebtoB이고웹응용서버가 JEUS라면 Java 기반의 SAML Library를이용해웹응용을구현해야한다. 본문서는웹응용서버 (Tomcat이나 JEUS) 에서구동되고전자정부프레임워크를이용해개발된웹응용을대상으로 Spring Security SAML extension의통합방법을기술한다. 또한 Shibboleth를이용해 SAML 기능을활성화시키는방법에대해서도설명한다. Spring Security SAML extension의매뉴얼은아래링크에서찾을수있다. Ÿ https://docs.spring.io/spring-security-saml/docs/current/reference/html 2. 기술프로파일 2.1 속성정보 서비스제공자는식별정보제공자가전달한속성정보를이용해사용자를인가 ( 접근권한의부여 ) 해야한다. 이용가능한속성정보는 https://www.kafe.or.kr/attributemap에서확인할수있다. 서비스제공자는 OID 형태의속성정보를처리해야한다. 아래표는 KAFE에서활용중인속성정보의일부를보여준다. 일반적으로식별정보제공자가 uid를제공하지않기때문에서비스제공자는 edupersontargetedid(eptid) 나 edupersonprincipalname(eppn) 을사용자에대한고유식별자로활용해야한다. 한명의사용자가다수의 email을가질수있으므로 email은사용자의고유식별자로적합하지않다. 하나의속성은여러개의값 (multiple value) 을가질수있으므로구현시반영해야한다. 속성명 oid 설명 edupersontargetedid 1.3.6.1.4.1.5923.1.1.1.10 고유식별자 edupersonprincipalname 1.3.6.1.4.1.5923.1.1.1.6 고유식별자 sn 2.5.4.4 성 givenname 2.5.4.42 이름 cn 2.5.4.3 성명 displayname 1.3.18.0.2.4.715 화면표시이름 mail 0.9.2342.19200300.100.1.3 이메일 edupersonaffiliation 1.3.6.1.4.1.5923.1.1.1.1 직무 edupersonscopedaffiliation 1.3.6.1.4.1.5923.1.1.1.9 기관내직무정보 organizationname 2.5.4.10 기관명 edupersontargetedid 는특정서비스제공자에서만유효한고유식별자이다. 예를들어, 사 - 3 -
용자 gildong hong 의 edupersontargetedid 는서비스제공자 #1 에서 fed01aaef204ae 이고 서비스제공자 #2 에서 02deffecc304ff 일수있다. edupersonprincipalname 은모든서비스 제공자에서유효한고유식별자이다. 예를들어, 사용자 gildong hong 의 edupersonprincipalname 이서비스제공자 #1 에서 fed01aaef204ae@kafe.or.kr 이라면서비 스제공자 #2 에서도 fed01aaef204ae@kafe.or.kr 이다. 자체적으로로그인기능을가지고있는서비스제공자가추가적으로 SAML 을이용한사용 자로그인을허용하고자한다면로컬로그인계정과 SAML 을통해로그인되는계정을상호 연결 (ID 연결서비스라칭함 ) 해야한다. ID 연결서비스가필요한서비스제공자는 SAML 을 통해로그인되는사용자계정의고유식별자로 edupersonprincipalname 을이용해야한다. 예를들어, 식별정보제공자가전달한 edupersonprincipalname 의값과로컬계정의 uid 를서 로연결시킴으로써 SAML 로로그인한사용자와로컬사용자를맵핑할수있다. SAML 속성정보 Local 계정정보 ID 연결 uid = {gdhong} if eppn=a0bec@home.org eppn={a0bec@home.org} name = {gildong hong} name = {gildong hong} email = {hong@home.org}..., SAML 전달정보 then; fi the user is gdhong 로컬계정 DB uid password 전화번호주소과학기술인등록번호기관코드 edupersonprincipalname edupersonprincipalname email email displayname displayname 서비스제공자가필요로하는속성정보는서비스제공자의메타데이터에기록되어식별정보제공자에게배포된다. 식별정보제공자는서비스제공자가요구하는속성정보중, 보유한속성정보만선택적으로제공한다. 사용자인가를위해필요한속성정보를서비스제공자가전달받지못했다면서비스제공자는해당이벤트를예외처리를해야한다. 예를들어, 필요하지만전달받지못한속성정보를사용자가입력할수있도록추가정보입력화면을제공하거나오류를발생시켜야한다. - 4 -
Chapter 2. SAML Integration 1. Spring SAML for Java Web Applications 1.1 검증환경 Spring Security SAML Extension은 Java 1.6 이상을필요로한다. 본문서의내용은다음표와같은환경에서검증되었다. 검증환경 상세 JDK 1.8.0 Tomcat 8.x 버전 (Tomcat 9 에서는구동안됨 ) Maven 이용된예제코드는아래주소에서내려받을수있다. git 또는 zip 파일을내려받은후 IDE(Integrated Development Environment) 에서 import 기능을사용하여프로젝트를불러 온다. Spring 예제저장소 Spring 예제다운로드 상세 https://git.kreonet.net/kafe-support/spring-security-saml2-sam ple https://git.kreonet.net/kafe-support/spring-security-saml2-sam ple/-/archive/master/spring-security-saml2-sample-master.tar. gz 1.2 메타데이터의구성서비스제공자는메타데이터를생성하고식별정보제공자의메타데이터와교환해야한다. 1.2.1 서비스제공자의메타데이터설정서비스제공자의메타데이터를설정하기위해서 WEB-INF 폴더의 securitycontext.xml 파일을수정한다. 코드 1-1 WEB-INF/securityContext.xml <bean id="metadatageneratorfilter" class="org.springframework.security.saml.metadata.metadatageneratorfilter"> <bean class="org.springframework.security.saml.metadata.metadatagenerator"> <property name="entityid" value="http://localhost:8080/saml/sp" /> <property name="extendedmetadata"> <bean class="org.springframework.security.saml.metadata.extendedmetadata"> - 5 -
<property name="signmetadata" value="false" /> <property name="idpdiscoveryenabled" value="true" /> </property> Ÿ 서비스제공자의개체식별자 (entityid) 설정개체식별자는식별정보제공자또는서비스제공자를나타내는고유식별자이다. 계정연합내에서중복될수없으며임의의문자열로표기할수있다. Spring 기반의서비스제공자인경우, KAFE는다음과같은표기규정의이용을권고하고있다. 코드 1-1의 http://localhost:8080/saml/sp을적절히수정한다. https://fqdn/sp/spring-saml2 Ÿ signmetadata 속성의 value 값은메타데이터를서명할것인지의여부를의미한다. 기본값은 false이다. Ÿ idpdiscoveryenabled 값은식별정보제공자탐색서비스의이용여부를의미한다. 계정연합에참여하고식별정보제공자와서비스제공자가 N:1로연동될때는탐색서비스를이용해야한다. 탐색서비스를이용할경우 value는 true로설정한다. 1.2.2 자가서명인증서 (Self-signed certificate) 의설치및설정 Tip SAML 자가서명인증서 SAML 메타데이터는공개키기반의인증서정보를포함해야한다. 인증서는메시지의복호 화와전자서명의검증에활용된다. SAML 기반의연합인증에서는자가서명인증서 (Self-signed certificate) 를이용한다. keystore 파일 (samlkeystrore.jks) 이있는디렉토리로이동한후 keytool을이용해자가서명인증서 ( 코드 1-2 참조 ) 를생성한다. 자가서명인증서는 HTTPS 서비스제공을위한 SSL 인증서와구분해이용해야한다. keystore 파일위치 spring-security-saml-master/spring-security-saml-master/sample/src/ main/resources/security/ 코드 1-2 keytool 명령어명세 keytool -genkey alias [ 인증서명 ] -validity 3650 -keyalg RSA -sigalg SHA256withRSA -keysize 2048 -keystore samlkeystore.jks keypass [ 인증서암호 ] -storepass [keystore 암호 ] -dname "CN=[ 도메인명 or IP 주소 ],OU=[ 부서명 ],O=[ 조직명 ],L=[ 위치 ],S=[ 도시 ],C=[ 국가명 ]" - 6 -
코드 1-3 Linux $ keytool -genkey alias apollo -validity 3650 -keyalg RSA -sigalg SHA256withRSA -keysize 2048 -keystore samlkeystore.jks keypass yourpassword -storepass nalle123 -dname "CN=localhost,OU=KAFE,O=KISTI,L=Yuseonggu,S=Daejeon,C=KR" 코드 1-4 Windows $ "C:\Program Files\Java\jdk1.8.0_131\jre\bin\keytool.exe" -genkey -alias apollo -validity 3650 -keyalg RSA -sigalg SHA256withRSA -keysize 2048 -keystore samlkeystore.jks -keypass yourpassword -storepass nalle123 -dname "CN=localhost,OU=KAFE,O=KISTI,L=Yuseonggu,,S=Daejeon,C=KR" CN=localhost의 localhost 는서버의실제 FQDN( 도메인명 ) 과일치해야함 위붉은색으로표시된부분은서비스환경에맞도록수정해실행 아래명령어를통해자가서명인증서를검증할수있다. keystore 이름과 keystore 암호 를 keymanager 에서확인할수있다. 예시에서는인증서파일이름은 samlkeystore.jks, 인 증서 alias 는 apollo, keystore 암호 (-storepass) 는 nalle123 이이용되었다. 코드 1-5 Linux $ keytool -list -keystore samlkeystore.jks -v -alias apollo 코드 1-6 Windows $ "C:\Program Files\Java\jdk1.8.0_131\jre\bin\keytool.exe" -list -keystore samlkeystore.jks -v -alias apollo 생성한인증서정보를 Spring Security SAML 설정에반영하기위해아래코드 1-7 의 적색부분을수정한다. 코드 1-7 WEB-INF/securityContext.xml <bean id="keymanager" class="org.springframework.security.saml.key.jkskeymanager"> <constructor-arg value="classpath:security/[jks_ 파일명 ]" /> <constructor-arg type="java.lang.string" value="[storepass]" /> <map> <entry key="[alias명 ]" value="[storepass]" /> </map> <constructor-arg type="java.lang.string" value="[alias명 ]" /> Ÿ jks_ 파일명 : eg. samlkeystore.jks Ÿ alias: eg. apollo Ÿ storepass: eg. nalle123 예제에서사용한값대신인증서를생성할때사용한정보를바탕으로입력 - 7 -
1.3 메타데이터의교환메타데이터생성을위한 securitycontext 설정이완료되면로그인을수행할식별정보제공자의메타데이터를서비스제공자에등록해야한다. 구현중인서비스제공자와 KAFE에서제공하는시험용식별정보제공자 (https://testidp.kreonet.net) 의서로교환한다. 시험용식별정보제공자의메타데이터는 https://testidp.kreonet.net/simplesaml/saml2/idp/metadata.php에서얻을수있다. 1.3.1. 시험용식별정보제공자의메타데이터를서비스제공자에등록구현중인서비스제공자의 securitycontext.xml(web-inf 폴더 ) 파일에시험용식별정보제공자의메타데이터를등록한다. https://git.kreonet.net/ 에서다운받은예제코드에는시험용식별정보제공자의메타데이터가이미설정되어있다. 코드 1-8 WEB-INF/securityContext.xml <bean id="metadata" class="org.springframework.security.saml.metadata.cachingmetadatamanager"> <list> <bean class="org.springframework.security.saml.metadata.extendedmetadatadelegate"> <bean class="org.opensaml.saml2.metadata.provider.httpmetadataprovider"> <value type="java.lang.string"> https://testidp.kreonet.net/simplesaml/saml2/idp/metadata.php </value> <value type="int">5000</value> <property name="parserpool" ref="parserpool" /> <bean class="org.springframework.security.saml.metadata.extendedmetadata"> <property name="metadatatrustcheck" value="false" /> </list> 코드 1-8과설정했으나메타데이터의획득에실패 ( 오류가발생 ) 하면시험용식별정보제공자의메타데이터를파일로내려 ( 코드 1-9 참조 ) 받아서비스제공자의 securitycontext.xml에등록 ( 코드 1-10 참조 ) 해야한다. 코드 1-9 시험용 ID 제공자메타데이터다운로드명령어 $ cd src/main/resources/metadata $ wget https://testidp.kreonet.net/simplesaml/saml2/idp/metadata.php -O testidp.xml - 8 -
코드 1-10 WEB-INF/securityContext.xml <bean class="org.springframework.security.saml.metadata.extendedmetadatadelegate"> <bean class="org.opensaml.saml2.metadata.provider.resourcebackedmetadataprovider"> <bean class="java.util.timer" /> <bean class="org.opensaml.util.resource.classpathresource"> <constructor-arg value="/metadata/testidp.xml" /> <property name="parserpool" ref="parserpool" /> <bean class="org.springframework.security.saml.metadata.extendedmetadata"> <property name="metadatatrustcheck" value="false" /> 1.3.2. 시험용식별정보제공자에서비스제공자의메타데이터등록서비스제공자에시험용식별정보제공자의메타데이터가등록되었으므로이번에는시험용식별정보제공자에서비스제공자의메타데이터를등록해야한다. 예제프로젝트를빌드한후, 아래링크를통해서비스제공자의메타데이터를다운로드한다. 아래붉은색으로표시된부분은구현환경에맞춰사용한다. 메타데이터주소 http://localhost:8080/spring-security-saml2-sample/saml/metadata < 서비스제공자의메타데이터 ( 예시 )> < 서비스제공자의메타데이터 ( 예시 )> 는다운로드받은서비스제공자의메타데이터파일 중일부를보여준다. Spring Security SAML 에서생성되는메타데이터에는서비스제공자가 - 9 -
필요로하는속성정보 ( 사용자정보, 위그림은파란색부분 ) 가포함되지않는다. 서비스제 공자가필요로하는속성정보를메타데이터에추가하기위해서위그림의파란색부분처럼 코드 1-11 의내용을추가한다. </md:spssodescriptor> 앞에코드 1-11 의내용을복사 해붙여넣는다. 식별정보제공자는서비스제공자의메타데이터에포함된속성명을참조해서속성정보를 제공한다. 예를들어, 서비스제공자의메타데이터에요구속성이 <md:requestedattribute FriendlyName="email" Name="urn:oid:0.9.2342.19200300.100.1.3" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isrequired="true"/> 만 포함되어있다면식별정보제공자는로그인한사용자의이메일주소만전달한다. 코드 1-11 Metadata의속성정보 <md:attributeconsumingservice index="2"><md:servicename xmlns:xml="http://www.w3.org/xml/1998/namespace" xml:lang="en"></md:servicename><md:requestedattribute FriendlyName="email" Name="urn:oid:0.9.2342.19200300.100.1.3" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isrequired="true"/><md:requestedattribute FriendlyName="uid" Name="urn:oid:0.9.2342.19200300.100.1.1" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isrequired="true"/><md:requestedattribute FriendlyName="displayName" Name="urn:oid:2.16.840.1.113730.3.1.241" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isrequired="true"/><md:requestedattribute FriendlyName="eduPersonTargetedID" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isrequired="true"/><md:requestedattribute FriendlyName="eduPersonPrincipalName" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isrequired="false"/><md:requestedattribute FriendlyName="organizationName" Name="urn:oid:2.5.4.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isrequired="false"/><md:requestedattribute FriendlyName="schacHomeOrganization" Name="urn:oid:1.3.6.1.4.1.25178.1.2.9" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isrequired="false"/><md:requestedattribute FriendlyName="eduPersonAffiliation" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.1" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isrequired="false"/></md:attributeconsumingservice> KAFE에서이용하는사용자속성정보의일부는다음과같다. 이용할수있는속성정보의전체목록은 https://www.kafe.or.kr/attributemap를참조한다. 서비스제공자가요청하는속성정보중식별정보제공자가제공할수없는속성정보는서비스제공자에게전달되지않는다. 예를들어, 서비스제공자가주민등록번호를요청했어도식별정보제공자가로그인한사용자의주민등록번호를제공할수없으면주민등록번호는서비스제공자에게전달될수없다. 속성명 oid 설명 edupersontargetedid 1.3.6.1.4.1.5923.1.1.1.10 고유식별자 edupersonprincipalname 1.3.6.1.4.1.5923.1.1.1.6 고유식별자 sn 2.5.4.4 성 givenname 2.5.4.42 이름 cn 2.5.4.3 성명 displayname 1.3.18.0.2.4.715 화면표시이름 mail 0.9.2342.19200300.100.1.3 이메일 edupersonaffiliation 1.3.6.1.4.1.5923.1.1.1.1 직무 edupersonscopedaffiliation 1.3.6.1.4.1.5923.1.1.1.9 기관내직무정보 organizationname 2.5.4.10 기관명 - 10 -
서비스제공자의메타데이터가확보되면시험용식별정보제공자 (https://testidp.kreonet.net) 에접속해해당메타데이터를등록한다. < 시험용식별정보제공 자 > 는 KAFE 에서제공하는시험용식별정보제공자를보여준다. < 시험용식별정보제공자 > 그림 < 시험용식별정보제공자 > 의붉은색상자로표시된부분에서 파일선택 을클릭해서비스제공자의메타데이터를선택하고 Upload 버튼을클릭하면서비스제공자의메타데이터가시험용식별정보제공자에등록된다. Input text 탭을클릭하면서비스제공자의메타데이터를 copy-and-paste할수있다. < 시험용식별정보제공자에서사용자등록 > 시험용식별정보제공자의 사용자등록 메뉴를클릭하면그림 < 시험용식별정보제공자에서사용자등록 > 과같이화면이나타난다. 해당식별정보제공자에서로그인이가능한임시사용자를생성할수있다. Username 등은임의로입력해도되지만실제이름등개인정보를입력하지않도록주의한다. Username 은사용자 ID를의미한다. 등록된서비스제공자의메타데이터와사용자계정은 24시간동안유효하다. - 11 -
1.3.3. 시험용시험용식별정보제공자와서비스제공자의연동확인 예제프로젝트를빌드한후, 웹브라우저를이용해예제응용서비스에접근한다. 붉게표 시된부분은서비스제공자의구축환경에맞춰적절히수정한다. 예제프로그램의접속주소 http://localhost:8080/spring-security-saml2-sample/ SAML Login을클릭하면, 그림 < 예제탐색서비스 > 와같은내장형탐색서비스를확인할수있다. 나타나는식별정보제공자 ( 예, https://testidp.kreonet.net/idp/simplesaml) 의목록은차이가있을수있다. 또한, KAFE에서제공하는중앙형탐색서비스를이용하면다른화면이나타난다. < 예제탐색서비스 > 시험용식별정보제공자를이용하기위해서 https://testidp.kreonet.net/idp/simplesamlphp 를선택한다. Start Single Sign On 을클릭하면그림 < 로그인화면 > 처럼시험용서비스제 공자의로그인화면이나타난다. < 로그인화면 > 1.3.2 절에서생성한사용자 ID(Username) 과비밀번호를입력하고로그인을시도한다. - 12 -
< 속성정보의화면표시 > 로그인에성공하면, 시험용식별정보제공자가전달한사용자속성정보를서비스제공자에 서확인할수있다 ( 위 < 속성정보의화면표시 > 를참조 ). - 13 -
1.4 웹응용과 Spring Security SAML 통합을위한상세기술 본절에서는 1.3 절의내용을보다구체적으로설명하고실제웹응용에 Spring Security SAML 의적용시고려해야할기술적사항에대해서살펴본다. 1.4.1. 예제코드 / 프로젝트의구조 https://git.kreonet.net 에서내려받은예제코드는다음과같은구조를가지고있다. 아래 구조를참조하여기운영중인웹응용서비스에 Spring Security SAML 을통합한다. sample-project/ - src/main/java/ - org.springframework.security.saml.web ( 웹응용에통합시, 붉은색파일들의복사필요 ) - MetadataController.java - MetadataForm.java - MetadataValidator.java - src/main/resources/ - metadata/idp.xml ( 웹응용에통합시, 파일다운로드또는신규생성필요 ) - security/samlkeystore.jks ( 웹응용에통합시, 신규생성필요 ) - src/main/webapp/ - index.jsp - logout.jsp - samlhandler.jsp - session.jsp - WEB-INF/ ( 웹응용에통합시, 복사후웹응용의환경에맞게설정변경 ) - securitycontext.xml ( 기존웹응용의설정과비교하여필요한부분수정및추가 ) - security/idpselection.jsp ( 탐색서비스를직접구현하는경우, UI 수정필요 ) 예제코드이웹응용에정상적으로통합되면아래의링크를통해로그인, 로그아웃등의기능을이용할수있다. 링크주소는구축된환경에따라달라질수있다. 연합인증에서식별정보제공자는로그인에성공한사용자의세션정보를유지한다. 로그아웃 (SLO) 은서비스제공자가식별정보제공자에게로그아웃을요청하고식별정보제공자는해당사용자의세션정보를삭제한다. SLO 시, 사용자가로그인한모든서비스제공자를로그아웃시킬수있다. SAML 로그인 SAML 로그아웃 ( 로컬 ) SAML 로그아웃 (SLO) 메타데이터내려받기 http://your-service/saml/login http://your-service/saml/logout?local=true http://your-service/saml/logout http://your-service/saml/metadata 로그아웃 ( 로컬 ) 은서비스제공자가식별정보제공자에게로그아웃을요청하지않고브라우 저세션만삭제하는방법이다. - 14 -
1.4.2. securitycontext.xml 이미서비스중인 Spring 기반의웹응용에 Spring Security SAML을통합할경우, 운영중인웹응용과 Spring Security SAML의 Context가충돌되지않도록설계해야한다. Spring에서인증 인가의처리는 https://minwan1.github.io/2017/04/22/2017-04-22-spring-security-implement/ 를참조한다. 웹응용을신규로개발할경우에는본절의내용을참고하여통합을진행한다. 코드 1-12 WEB-INF/securityContext.xml <security:http security="none" pattern="/favicon.ico" /> <security:http security="none" pattern="/images/**" /> <security:http security="none" pattern="/css/**" /> <security:http security="none" pattern="/logout.jsp" /> Ÿ 코드 1-12 의 security= none 은 SAML 인증이필요하지않은 PATH 를지정할때사 용한다. 이미지경로, CSS 경로등 SAML 인증을받지않고접근해야하는 PATH 를 지정한다. 코드 1-13 WEB-INF/securityContext.xml <security:http pattern="/saml/web/**" use-expressions="false"> <security:access-denied-handler error-page="/saml/web/metadata/login" /> <security:form-login login-processing-url="/saml/web/login" login-page="/saml/web/metadata/login" default-target-url="/saml/web/metadata" /> <security:intercept-url pattern="/saml/web/metadata/login" access="is_authenticated_anonymously" /> <security:intercept-url pattern="/saml/web/**" access="role_admin" /> <security:custom-filter before="first" ref="metadatageneratorfilter" /> </security:http> <security:http entry-point-ref="samlentrypoint" use-expressions="false"> <security:intercept-url pattern="/saml/web//**" access="is_authenticated_fully" /> <security:custom-filter before="first" ref="metadatageneratorfilter" /> <security:custom-filter after="basic_auth_filter" ref="samlfilter" /> </security:http> <bean id="samlfilter" class="org.springframework.security.web.filterchainproxy"> <security:filter-chain-map request-matcher="ant"> <security:filter-chain pattern="/saml/login/**" filters="samlentrypoint" /> <security:filter-chain pattern="/saml/logout/**" filters="samllogoutfilter" /> <security:filter-chain pattern="/saml/metadata/**" filters="metadatadisplayfilter" /> <security:filter-chain pattern="/saml/sso/**" filters="samlwebssoprocessingfilter" /> <security:filter-chain pattern="/saml/ssohok/**" filters="samlwebssohokprocessingfilter" /> <security:filter-chain pattern="/saml/singlelogout/**" filters="samllogoutprocessingfilter" /> <security:filter-chain pattern="/saml/discovery/**" filters="samlidpdiscovery" /> </security:filter-chain-map> Ÿ 사용자인증을받아야접근할수있는 PATH 를정의하고해당 PATH 에접근했을때 어떻게처리해야되는지필터를구현 / 설정해야한다 ( 코드 1-13 참조 ). - 15 -
코드 1-14 WEB-INF/securityContext.xml <bean id="successredirecthandler" class="org.springframework.security.web.authentication.savedrequestawareauthenticationsuccesshandler"> <property name="defaulttargeturl" value="/samlhandler.jsp" /> <bean id="failureredirecthandler" class="org.springframework.security.web.authentication.simpleurlauthenticationfailurehandler"> <property name="useforward" value="true" /> <property name="defaultfailureurl" value="/error.jsp" /> <bean id="successlogouthandler" class="org.springframework.security.web.authentication.logout.simpleurllogoutsuccesshandler"> <property name="defaulttargeturl" value="/logout.jsp" /> Ÿ 코드 1-14 는로그인과로그아웃요청의결과에따라이동할경로를설정하는필터이 다. Ÿ 웹응용이연합인증과함께로컬로그인이나 OIDC/OAuth2 기반의인증방식을사용하 는경우에는, bean id 값 ( 예, successredirecthandler) 과 defaulttargeturl 값 ( 예, /samlhandler.jsp) 은연합인증에서설정한값과달라야한다. 또한 defaulttargeturl 값 에설정된파일에서사용자인증 and/or 인가방식을구현해야한다. bean id 값과 defaulttargeturl 값을기존인증방식과중복되지않게설정했으나오류가발생한다면 securitycontext.xml 설정 ( 코드 1-13 참조 ) 에서 /saml/sso/ 경로에대한필터 (samlwebssoprocessingfilter) 를제거한후, SAML Response 메시지를처리할수있는필터를직접구현해야한다 ( 아래테이블을참조 ). [ 확인필요 ] 기존인증방식이 samlwebssoprocessingfilter에서사용하고있는 handler 등을동일하게사용하고있을가능성이있다. SAML 로그인처리를위한경로 POST 매개변수명 파싱및검증관련참고코드 http://your-service/saml/sso SAMLResponse https://github.com/oaeproject/samlparser/blob/master/src/ma in/java/org/sakaiproject/samlparser/samlparser.java 사용자가로그인이성공하면식별정보제공자는 SAML Response 메시지 ( 사용자속성정보가포함됨 ) 를 HTTP-POST 방식으로 /saml/sso 엔드포인트에전달한다. /saml/sso 경로에응답메시지가도착했을때해당메시지를처리할수있는코드를구현해야한다. 구현되는코드에는 SAML Response에대한파싱및전자서명의검증등이포함되어야한다. - 16 -
1.4.3. 사용자속성정보의활용 웹응용이기존에사용하는로그인방식이있다면 SAML Response 로전달받은사용자 속성을 HTTP 세션에저장하고기존로그인방식과통합할수있다. 속성정보를 HTTP 세 션에저장하는방법은아래코드를참조한다. 코드 1-15 속성정보활용코드, samlhandler.jsp 파일참조 <%@page import="java.util.arraylist"%> <%@page import="java.util.collections"%> <%@page import="java.util.collection"%> <%@page import="org.springframework.security.saml.samlcredential"%> <%@page import="org.springframework.security.core.context.securitycontextholder"%> <%@page import="org.springframework.security.core.authentication"%> <%@page import="org.opensaml.saml2.core.attribute"%> <%@page import="org.springframework.security.saml.util.samlutil"%> <%@page import="org.opensaml.xml.util.xmlhelper"%> <% String islogin = ""; try { islogin = session.getattribute("islogin").tostring(); } catch (Exception e) { } if (!islogin.equals("true")) { try { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); SAMLCredential credential = (SAMLCredential) authentication.getcredentials(); for (Attribute attribute : credential.getattributes()) { String name = attribute.getname(); String values = credential.getattributeasstring(name); session.setattribute(name, values); } session.setattribute("islogin", "true"); islogin = session.getattribute("islogin").tostring(); } catch (Exception e) { } } %>
2. Shibboleth for Java Web Applications 본장에서는웹서버와웹응용서버가분리되어있고 Apache HTTPD가웹서버로활용되는 CentOS 7(Apache 2.4) 환경에서 Shibboleth를이용해연합인증을구현하는방법을설명한다. Shibboleth는 Apache, IIS, FastCGI에서동작한다. CentOS를이용할경우, selinux를비활성하거나 Shibboleth가예외처리될수있도록설정해야한다. $ getenforce $ setenforce 0 $ nano /etc/sysconfig/selinux SELINUX=permissive 2.1 yum 을이용한 Shibboleth 설치및환경설정 Apache 2.4 가설치되어있다는가정하에설명한다. 다음과같이설치한다. $ yum install ca-certificates openssl // shibboleth repository를생성 $ nano /etc/yum.repos.d/shibboleth.repo [shibboleth] name=shibboleth (CentOS_7) # Please report any problems to https://issues.shibboleth.net type=rpm-md mirrorlist=https://shibboleth.net/cgi-bin/mirrorlist.cgi/centos_7 gpgcheck=1 gpgkey=https://download.opensuse.org/repositories/security:/shibboleth/centos_7/repodata/repo md.xml.key enabled=1 $ yum update y // 64 비트 OS 일경우 $yum install shibboleth.x86_64 -y 2.1.1 Apache 설정다음예를참조하여 ( 구축된서버의 IP 주소나도메인명에맞게 ) 호스트를설정한다. $ nano /etc/hosts 192.168.xx.yy sp.example.org sp - 18 -
방화벽은항상 443포트를개방해야한다. < 중요 > SSL 인증서를설치해 HTTPS로통신케해야한다. 80번포트는 localhost로만개방하도록설정하고모든 HTTP 트래픽은 HTTPS로리다이렉션될수있도록설정한다. $ nano /etc/httpd/conf/httpd.conf Listen 127.0.0.1:80 $ nano /etc/httpd/conf.d/000-default.conf <VirtualHost *:80> ServerName "sp.example.org" Redirect permanent "/" "https://sp.example.org/" RedirectMatch permanent ^/(.*)$ https://sp.example.org/$1 </VirtualHost> $ service httpd restart 특정디렉토리로접근했을때, Apache 가 Shibboleth 인증을수행하도록다음예를참조하 여 Apache 를설정한다. 아래예는사용자가 https://sp.example.org/secure 로접근했을때, Shibboleth 인증을수행한다. 코드 2-1 Apache 설정 <Location /secure> AuthType shibboleth # ShibCompatWith24 On ShibRequestSetting requiresession 1 require shib-session </Location> $ service httpd restart 2.1.2 Shibboleth 설정다음예를참조하여 ( 구축된서버의 IP 주소나도메인명에맞게 ) 호스트를설정한다. Shibboleth를환경설정한다. entityid는계정연합내에서유일해야한다. KAFE에서는서비스제공자에대해서다음과같은표기법을권장하고있다. https://[fqdn]/sp/[saml software] ( 예, https://sp.example.org/sp/shibboleth) 코드 2-2 $ nano /etc/shibboleth/shibboleth2.xml Shibboleth2.xml 의설정... - 19 -
<ApplicationDefaults entityid="https://sp.example.org/shibboleth" REMOTE_USER="eppn persistent-id targeted-id" attributeprefix="ajp_"> ciphersuites="default:!exp:!low:!anull:!enull:!des:!idea:!seed:!rc4:!3des:!krsa:! SSLv2:!SSLv3:!TLSv1:!TLSv1.1">... <Sessions lifetime="28800" timeout="3600" relaystate="ss:mem"... checkaddress="false" handlerssl="true" cookieprops="https"> <CredentialResolver type="file" key="shibsp.key" certificate="shibsp.crt"/>... <SSO discoveryprotocol="samlds" discoveryurl="https://ds.kreonet.net/kafe"> SAML2 SAML1 </SSO>... <Errors supportcontact="support@example.org"... helplocation="/about.html" stylesheet="/shibboleth-sp/main.css"/> <MetadataProvider type="xml" url="https://fedinfo.kreonet.net/signedmetadata/federation/kafe-testfed/metadata.xml" legacyorgname="true" maxrefreshdelay="7200"> <MetadataFilter type="signature" certificate="kafe-cert.crt"/> backingfilepath="kafe-test-metadata.xml" <MetadataFilter type="requirevaliduntil" maxvalidityinterval="864000" /> </MetadataProvider> <AttributeExtractor type="xml" validate="true" reloadchanges="true" path="attribute-map.xml"/> AJP 규약을사용할경우, attributeprefix="ajp_" 를추가한다. kafe-cert.crt 파일을다음주소로부터내려받아 /etc/shibboleth에저장한다. https://fedinfo.kreonet.net/cert/kafe-fed.crt shibsp.key와 shibsp.crt의생성 $ cd /etc/shibboleth $ openssl req -newkey rsa:4096 -new -x509 -days 3650 -nodes -text -out shibsp.crt -keyout shibsp.key $ chmod 644 shibsp.key shibsp.crt KAFE 에서제공하는중앙형탐색서비스를이용할경우, 탐색서비스 URL 주소를 discoveryurl="https://ds.kreonet.net/kafe" 와같이설정한다. - 20 -
KAFE 에서제공하는연합메타데이터 (test federation) 를이용할경우, MetadataProvider 를다음과같이설정한다. url="https://fedinfo.kreonet.net/signedmetadata/federation/kafe-testfed/metadata.xml 시험용식별정보제공자 (https://testidp.kreonet.net) 를연동할경우, shibboleth2.xml 파일의 MetadataProvider를다음과같이설정한다. <MetadataProvider type="xml" validate="false" u r i = " h t t p s : / / t e s t i d p. k r e o n e t. n e t / s i m p l e s a m l / s a m l 2 / i d p / m e t a d a t a. p h p " backingfilepath="testidp-metadata.xml" reloadinterval="7200"> </MetadataProvider> 서비스제공자가필요로하는사용자속성정보를추가할경우, shibboleth2.xml 파일에요 구속성을다음예를참조하여설정한다. <Handler type="metadatagenerator" Location="/Metadata" signing="false"> <md:attributeconsumingservice index="1"> <md:servicename xml:lang="en">liferay Test</md:ServiceName> <md:requestedattribute FriendlyName="displayName" Name="urn:oid:2.16.840.1.113730.3.1.241"/> <md:requestedattribute FriendlyName="mail" Name="urn:oid:0.9.2342.19200300.100.1.3"/> <md:requestedattribute FriendlyName="uid" Name="urn:oid:0.9.2342.19200300.100.1.1"/> <md:requestedattribute FriendlyName="orgName" Name="urn:oid:2.5.4.10"/> <md:requestedattribute FriendlyName="eppn" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6"/> <md:requestedattribute FriendlyName="persistent-id" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10"/> <md:requestedattribute FriendlyName="schacHomeOrganization" Name="urn:oid:1.3.6.1.4.1.25178.1.2.9"/> <md:requestedattribute FriendlyName="unscoped-affiliation" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.1"/> </md:attributeconsumingservice></md:spssodescriptor> </Handler> 새로운사용자속성을추가할경우, 다음예를참조하여 attribute-map.xml 파일을수정 - 21 -
한다. $ nano /etc/shibboleth/attribute-map.xml <!-- SCHAC attributes, uncomment to use... --> // 아래라인활성화 <Attribute name="urn:oid:1.3.6.1.4.1.25178.1.2.9" id="schachomeorganization"/>... // 아래모든라인활성화 <Attribute name="urn:oid:2.5.4.3" id="cn"/> <Attribute name="urn:oid:2.5.4.4" id="sn"/> <Attribute name="urn:oid:2.5.4.42" id="givenname"/> <Attribute name="urn:oid:2.16.840.1.113730.3.1.241" id="displayname"/> <Attribute name="urn:oid:0.9.2342.19200300.100.1.1" id="uid"/> <Attribute name="urn:oid:0.9.2342.19200300.100.1.3" id="mail"/>... // 아래라인활성화 <Attribute name="urn:oid:2.5.4.10" id="o"/> Shibboleth는기본적으로 Scope를검증한다. 예를들어, 식별정보제공자가 Scope="school.ac.kr" 로설정했다면사용자속성에포함된 Scope이 school.ac.kr을포함하는지검사한다 ( 예, eppn은 id@scope 형식이고 Scope에해당되는값이 myschool.ac.kr이라면식별정보제공자가정의한 Scope(school.ac.kr) 과다르기때문에오류가발생 ). 이와같은속성정책을변경하기위해서는다음예를참조하여 attribute-policy.xml 파일을수정한다. 아래예에서주석 (<!-- -->) 을제거하면 schachomeorganization의 Scope를검사한다. $ nano /etc/shibboleth/attribute-policy.xml <!-- Enforce that the values of schachomeorganization are a valid Scope. --> <!-- <afp:attributerule attributeid="schachomeorganization"> <afp:permitvaluerule xsi:type="saml:attributevaluematchesshibmdscope" /> </afp:attributerule> --> 2.1.3 Shibboleth 설정확인 다음명령과 URL 주소를참조하여 Shibboleth 를관리한다. 명령어 service shibd start service shibd stop Shibboleth 실행 Shibboleth 중지 설명 - 22 -
shibd -t Shibboleth 구동상태 URL 주소 https://[fqdn]/shibboleth.sso/metadata https://[fqdn]/shibboleth.sso/session 설명서비스제공자의메타데이터확인세션정보의확인 2.2 AJP 설정 웹서버 (Apache) 에설치된 Shibboleth는 mod_ajp 또는 mod_jk를이용해웹응용서버 ( Tomcat 또는 JEUS) 에게속성정보를전달한다. Servlet 컨테이너중, Tomcat은 AJP 1.3을기본으로지원하고 JEUS는 mod_jk만지원하며 Jetty는 mod_ajp를지원하지않는다. 필요시, Servlet 컨테이너가 AJP 또는 JK를지원할수있도록설정한다. [option] 사용자가 Servlet 컨테이너에직접접근할수없도록 Apache 환경을설정해야한다. 예를들어, Tomcat 8080 포트에대한 Apache 설정이없으면 Shibboleth가 bypass된다. 먼저코드 2-1의 Apache 설정을적용하고코드 2-2의 attributeprefix를 attributeprefix="ajp_" 로설정한다. [ 중요 ] mod_proxy_ajp를이용해변수들을전달하기위해서는반드시 AJP_ 프릭픽스를이용해야한다. 본예에서는 Shibboleth로보호받는디렉토리는 /secure이다. Apache에 ShibUseHeaders On을설정하면 HTTP request headers를이용해변수들을전달할수있지만 AJP를이용하는것보다덜안전한것으로알려져있다. HTTP 헤더를통해전달하기위해서는프리픽스가 HTTP_ 로변경되어야한다. 2.2.1 AJP 패킷사이즈서비스제공자가다수의사용자속성정보를요구한다면기본 AJP 패킷크기인 8Kb를초과할수있다. Apache와 Servlet 컨테이너모두에서 AJP 패킷크기를 65Kb( 최대크기임 ) 로증가시킨다. Tomcat의 AJP <Connector> 에서 packetsize="65536" 로설정한다. Apache 설정에서 ProxyIOBufferSize 65536으로설정한다. ProxyIOBufferSize 65536 2.2.2 Apache 설정코드 2-1을설정함으로써 Protected Resource를설정해야한다. 또한 Apache로입력되는요청을 AJP 1.3을통해웹응용서버에전달할수있도록 Apache에 ProxyPass를설정해야한다. 다음예를참조한다. ProxyPass /secure ajp://localhost:8009/secure - 23 -
Chapter 3. 계정연합참여 1. 계정연합 (KAFE) 연동 https://testidp.kreonet.net에서기능검증이끝나면, 서비스제공자의개별메타데이터가 KAFE(support@kafe.or.kr) 에제출되면최대 1일이내에개별메타데이터가해당되는연합메타데이터에포함되어배포된다. 즉, 식별정보제공자들이해당서비스제공자와연동되는데는최대 1일이필요하다. 서비스제공자의메타데이터는다음사항을충족시켜야한다. Ÿ 메타데이터에는 IP 주소가포함되지않아야한다. Ÿ 메타데이터에포함된모든 URL 주소는 https로시작되어야하며실제로접근가능해야한다. Ÿ 메타데이터에포함된인증서는 SHA256 이상의서명알고리즘과 2048 이상의키길이를가져야한다. Tip KAFE 연합메타데이터 KAFE 연합메타데이터는다수의식별정보제공자와서비스제공자의개별메타데이터를포함하고있다. 연합메타데이터는검증 (Test), 프로덕션 (Production), 에듀게인 (EduGAIN) 으로구분된다. 서비스제공자가에듀게인에참여하고에듀게인용메타데이터를등록하면국외식별정보제공자를통해국외사용자가해당서비스제공자에로그인할수있다. 서비스제공자는, 개별메타데이터를 KAFE에제출한후, KAFE 계정연합에서배포중인연합메타데이터 (Federation metadata) 를등록해야한다. KAFE에서제공하는연합메타데이터는 test federation 용과 production federation 용으로구분된다. 모든서비스제공자는 test federation 용메타데이터를이용해실제서비스환경에서서비스제공자가정상적으로동작하는지확인해야한다 ( 즉, test federation 에연동된식별정보제공자를통해정상적으로로그인할수있고식별정보제공자로부터속성정보를획득할수있는지확인필요 ). 정회원에가입하면 production federation 용연합메타데이터를이용할수있다. 참여방법은 https://www.kafe.or.kr/join을참조한다. 연합메타데이터의배포 URL 주소는다음표 (https://www.kafe.or.kr/join 참조 ) 와같다. test federation production federation https://fedinfo.kreonet.net/signedmetadata/federation/kafe-testfed/m etadata.xml https://fedinfo.kreonet.net/signedmetadata/federation/kafe-profed/me tadata.xml test federation 용연합메타데이터를서비스제공자에등록하는방법은다음과같다. 1.1 Spring Security SAML - 24 -
코드 1-1 WEB-INF/securityContext.xml <bean id="metadata" class="org.springframework.security.saml.metadata.cachingmetadatamanager"> <list>... <bean class="org.springframework.security.saml.metadata.extendedmetadatadelegate"> <bean class="org.opensaml.saml2.metadata.provider.httpmetadataprovider"> <value type="java.lang.string"> https://fedinfo.kreonet.net/signedmetadata/federation/kafe-testfed/metadata.xml </value> <value type="int">5000</value> <property name="parserpool" ref="parserpool" /> <bean class="org.springframework.security.saml.metadata.extendedmetadata"> <property name="metadatatrustcheck" value="true" />... </list> 코드 1-1의 metadatatrustcheck이 true로설정된경우, KAFE에서제공하는인증서를 이용해연합메타데이터의무결성을검증할수있다. KAFE 에서제공하는서명용인증서는 서비스제공자의 keystore 에등록되어야한다. 서명용인증서는아래주소에서내려받을수 있다. https://fedinfo.kreonet.net/cert/kafe-fed.crt 코드 1-2 keystore에 KAFE 서명용인증서등록 (Linux) $ cd src/main/resources/security/ $ wget https://fedinfo.kreonet.net/cert/kafe-fed.crt $ keytool importcert keystore samlkeystore.jks -storepass [keystore 암호 ] -alias kafe-fed file kafe-fed.crt 코드 1-3 keystore에 KAFE 서명용인증서등록 (Windows) $ "C:\Program Files\Java\jdk1.8.0_131\jre\bin\keytool.exe" -importcert -keystore samlkeystore.jks -storepass nalle123 -alias kafe-fed file kafe-fed.crt - 25 -
1.2. 탐색서비스설정 < 중앙형식별정보제공자탐색서비스 > 서비스제공자는로그인할기관 ( 식별정보제공자 ) 을사용자가선택할수있도록해야한다 ( 예, 서울대학생은서울대의식별정보제공자에로그인해야함 ). 서비스제공자가하나의식별정보제공자만연동할경우에는탐색서비스가필요하지않다. 하지만, 두개이상의식별정보제공자와연동하기위해서는탐색서비스를이용해야한다. 서비스제공자는 KAFE에서제공하는중앙형탐색서비스 (Central discovery service) 를이용하거나자체적으로내장형탐색서비스 (Embedded discovery service) 를구현할수있다. 내장형탐색서비스는서버다운등중앙형탐색서비스의구동상태에영향을받지않는장점이있다. 1.2.1 Spring Security SAML KAFE 에서제공하는중앙형탐색서비스를이용하기위해서 securitycontext 를다음과같 이설정한다. 코드 2-1 <bean id="metadatageneratorfilter" WEB-INF/securityContext.xml - 26 -
class="org.springframework.security.saml.metadata.metadatageneratorfilter"> <bean class="org.springframework.security.saml.metadata.metadatagenerator"> <property name="entityid" value="http://localhost:8080/saml/sp" /> <property name="extendedmetadata"> <bean class="org.springframework.security.saml.metadata.extendedmetadata"> <property name="signmetadata" value="false" /> <property name="idpdiscoveryenabled" value="true" /> <property name="idpdiscoveryurl" value="https://ds.kreonet.net/kafe" /> </property> 탐색서비스가구현중인서비스제공자와정상적으로연동되면로그인버튼등을클릭했을때위 < 중앙형식별정보제공자탐색서비스 > 와같은화면을나타난다. 탐색서비스로이동하면웹브라우저의주소창의확인한다. 매개변수로 entityid, return, returnidparam 를갖지않는다면탐색서비스가정상적으로동작하지않는다. 매개변수가정상적으로설정되지않았다면로그인버튼의하이퍼링크를아래와같이설정해사용한다. 로그인호출 URL 예시 https://ds.kreonet.net/kafe?entityid=[ 서비스제공자의 entityid]&return=[ 탐색에성공한후리턴할주소 ]&returnidparam=idp https://ds.kreonet.net/kafe?entityid=https://myservice.kr/saml/sp&return=h ttps://myservice.kr/saml/login&returnidparam=idp - 27 -