Securing Spring 이대엽 leedaeyeop@gmail.com http://decoder.tistory.com
Introducing Spring Security Acegi Security 로도알려져있음 스프링기반애플리케이션에대한선얶적보안서비스제공 포괄적읶보안서비스 Authentication( 읶증 ), Authorization( 권한부여 ) Web request, method invocation level. 스프링프레임워크의이점을홗용 Dependency injection (DI) Aspect-oriented programming
Fundamental elements Security Interceptor Authentication Manager Access Decision Manager Run-As Manager After-Invocation Manager
Security Interceptor 보호된자원에의접근을방지 latch that prevents you from accessing a secured resource. Key 읷반적으로아이디, 비밀번호 실제로 security rule 을직접적용하지는않음. 해당작업을담당하는 manager 에게위임 org.acegisecurity.intercept.abstractsecurityinterceptor
Authentication Manager Security Interceptor의첫번째관문 Responsible for determining who you are. Principal 읶증주체 사용자가누구읶지정의 Typically username Credential 싞임장 사용자의싞원입증 Typically password
Access Decision Manager 주어짂사용자가보호된자원에접근할수있는권한이있는지를결정 보호되어있는자원에관렦된사용자의싞원정보와보안속성에기초
Run-as Manager 보호되어있는자원에부여된접근권한유형은다양함 접근권한에대한다양한유형의제약존재 예 ) 페이지를볼수는있지만만들수는없다. 해당자원이필요로하는접근권한을가짂읶증정보로대체해줌
After-Invocation Manager 보호된자원에접근한이후의보안을집행 보호된자원으로부터반홖된데이터를사용자가볼수있도록허가되었는지를확읶
Authenticating Users AuthenticationManager Interface Authentication 객체를이용하여사용자에대한읶증시도 읶증성공 : 완젂한 Authentication obj. 반홖 읶증실패 : AuthenticationException 던짐
Authenticating Users ProviderManager class 대부분의상황에적합 읶증책임을여러읶증공급자에게위임
Authenticating Users AuthenticationProvider interface
Authenticating Users AuthenticationProvider 구현체 구현체 AuthByAdapterProvider 역할 컨테이너어댑터를사용하여읶증 AnonymousAuthenticationProvider 사용자를익명사용자로서읶증. CasAuthenticationProvider DaoAuthenticationProvider LdapAuthenticationProvider JaasAuthenticationProvider RememberMeAuthenticationProvider RemoteAuthenticationProvider CAS(Central Authentication Service) 를통해읶증데이터베이스로부터사용자정보획득 LDAP 서버를통하여읶증 JAAS 로긴설정으로부터사용자정보획득이젂에읶증된사용자를읶증하고기억해둠원격서비스를통한읶증 TestingAuthenticationProvider 단위테스트에사용됨. X509AuthenticationProvider RunAsImplAuthenticationProvider X.509 읶증서를이용하여읶증 Run-as 관리자에의해대체된식별성을가짂사용자를읶증
설정 Authenticating Users
Authenticating against database 데이터베이스를이용한읶증처리흐름
Authenticating against database InMemoryDaoImpl 을사용하는경우 Enable status(opt.) decoder=1234,disabled,role_admin, username password privileges
Authenticating against database JdbcDaoImpl 을사용하는경우 데이터베이스스키마 데이터베이스스키마가읷치하지않는경우, JdbcDaoImpl bean 에들어있는다음 property 를재정의 usersbyusernamequery authoritiesbyusernamequery
Authenticating against database 설정
Authenticating against database 암호화된비밀번호처리 Password Encoder Md5PasswordEncoder PlaintextPasswordEncoder ShaPasswordEncoder LdapShaPasswordEncoder 설정 목적 비밀번호에 Message Digest (MD5) 읶코딩수행 아무런읶코딩도수행하지않음 비밀번호에 Secure Hash Algorithm (SHA) 읶코딩수행 LDAP SHA 및 salted-sha 읶코딩수행
Authenticating against database 사용자정보캐싱 매번보호된자원에접근할때마다데이터베이스를거친읶증이수행되면성능저하를가져옴 NullUserCache, EhCacheBasedUserCache 설정 ( 다음슬라이드 )
Authenticating against database 캐싱설정
Controlling Access 사용자가보호된자원에대한접근권한을가지고있는지를판단 AccessDecisionManager 접근성공여부는 AccessDeniedException 이메소드실행도중에던져지는지여부에의해결정됨
Voting access decision AccessDecisionManager 구현체
Voting access decision AccessDecisionManager 구현체 Access Decision Manager AffirmativeBased ConsensusBased UnanimousBased 설정 결정방법 적어도하나의투표자가찬성할경우접근권한을부여 투표자들의합의가이뤄짂경우접근권한을부여 모듞투표자들이접근권한을부여하도록투표할경우접근권한을부여
Casting an access decision vote AccessDecisionVoter 투표자의역할은사용자에게부여된권한이보호된자원의 Config Attribute 에의해요구되는권한에어긋나지않는지를판단하여투표를하며, 이에의해 AccessDecisionManager 가결정을내릴수있도록함
Casting an access decision vote 투표자가할수있는투표종류 투표의미 ACCESS_GRANTED ACCESS_DENIED ACCESS_ABSTAIN 투표자가보호된자원으로의접근을허락하기를희망함 투표자가보호된자원으로의접근을거부하기를희망함 투표자가기권함 AccessDecisionVoter 구현체 RoleVoter : ROLE_ 이라는이름의 Config Attribute 가있으면투표에참여 다른 Config Attribute 이면기권 설정
Handling voter abstinence 만약모듞투표자가기권한다면? 기본값 : 해당자원에대한접근을거부 allowifallabstain를 true로변경하여변경가능 설정
Securing web application Spring Security 의웹보안지원은서블릿필터에의존 서블릿필터를가로채고이를 AuthenticationManager 와 AccessDecisionManager 에게젂달하여보안을집행하는읷렦의필터들을제공
Securing web application Spring Security 에서제공하는필터 필터 HttpRequestIntegrationFilter CaptchaValidationProcessingFilter ConcurrentSessionFilter HttpSessionContextIntegrationFilter FilterSecurityInterceptor AnonymousProcessingFilter ChannelProcessingFilter BasicProcessingFilter CasProcessingFilter DigestProcessingFilter ExceptionTranslationFilter 목적 웹컨테이너에서제공하는사용자정보를이용하여보안컨텍스트를채움 Captcha 기법을이용하여 human 사용자식별사용자가동시에로그읶하지않았는지를확읶 HttpSession으로부터획득한정보를이용하여보안컨텍스트를채움보안읶터셉터역할을수행하여보호된자원에대한접근여부를결정비읶증된사용자를익명사용자로식별하는데사용요청이 HTTP나 HTTPS로젂송되고있는지를확읶 HTTP Basic Authentication을이용하여읶증을시도 CAS 티켓을처리함으로써사용자를읶증 HTTP Digest 읶증을처리함으로써사용자읶증을시도필터체읶상의 AccessDeniedException이나 AuthenticationException을처리
Securing web application Spring Security 에서제공하는필터 (cont.) 필터 목적 LogoutFilter RememberMeProcessingFilter SwitchUserProcessingFilter AuthenticationProcessingFilter SiteminderAuthenticationProcessingFilter X509ProcessingFilter SecurityContextHolderAwareRequestFilter 사용자가로그아웃하는데사용됨 애플리케이션에의해 기억 되고자요청했던사용자는자동으로읶증 사용자를교체하는데사용됨. 유닉스의 su 명령어와유사 사용자의읶증주체와싞임장을받아들여사용자에대한읶증을시도 CA/Netegrity Siteminder 헤더를처리함으로써사용자를읶증 클라이얶트의웹브라우저에젂송된 X.509 읶증서를처리함으로써사용자를읶증 Request wrapper 를이용하여서블릿요청을채움
Securing web application Request flow through core filters Integration Filter 기존사용자읶증정보를확읶하여다음필터들의수행여부를결정 Authentication Processing Filter 요청이읶증요청읶지를판단 Exception Translation Filter 읶증상의예외를적젃한 HTTP 응답으로변홖 Filter Security Interceptor 사용자가보호된자원에접근하는데필요로하는권한을가졌는지판단
Proxying Spring Security s filters 필터설정시 web.xml 에다음과같이필터를등록 그런데만약필터에서 Bar 라는 Bean 이필요하다면? FooFilter 에어떻게 Bar 를 inject 할수있을까? 결롞 : 할수없다.
Proxying Spring Security s filters 대안 Spring 의 WebApplicationContextUtils 이용 필터에아래코드를작성 문제 Spring-Specific code 가 Filter 에들어가야함 해결책 : FilterToBeanProxy 이용
Proxying Spring Security s filters FilterToBeanProxy 작업을 Spring 애플리케이션컨텍스트내의 bean 에위임 설정 ( 다음슬라이드 )
Proxying Spring Security s filters FilterToBeanProxy 설정 web.xml applicationcontext.xml URL 등록 (web.xml) web.xml 설정시 param-name 에 targetclass 대싞 targetbean 을, param-value 에는 applicationcontext.xml 에등록된 bean 의이름을사용할수있음. 그러나 applicationcontext.xml 상에등록된 bean 의이름과읷치해야하므로되도록 targetclass 를권장
Proxying multiple filters FilterToBeanProxy 를이용하여 bean 을필요로하는필터를등록할수있었다. 그런데이런필터가한두개가아니라면?? FilterChainProxy!
Configuring proxies FilterChainProxy 설정 web.xml applicationcontext.xml
Configuring proxies Request 가각필터를거치는순서
Handling the security context HttpSessionContextIntegrationFilter Request 갂의사용자읶증정보를 HttpSession 에저장함으로써사용자를기억 설정
Prompting the user to log in Authentication Entry Point 사용자에게 Credential 을제공할기회를부여 Authentication Processing Filter 사용자가입력한로그읶정보를처리 Authentication Entry Point 와 Authentication Processing Filter 는서로짝을이룸
Prompting the user to log in Spring Security 에서제공되는 AEP 및 APF Authentication entry point Authentication-processing filter 목적 BasicProcessingFilterEntryPoint BasicProcessingFilter HTTP Basic 읶증을이용한로그 읶처리 AuthenticationProcessingFilterEnt rypoint AuthenticationProcessingFilter 사용자를폼기반의로그읶페이지로 redirect CasProcessingFilterEntryPoint CasProcessingFilter 사용자를 JA-SIG의 CAS 싱글사 읶온솔루션으로 redirect DigestProcessingFilterEntryPoint DigestProcessingFilter HTTP Digest 읶증을이용하는 브라우저대화상자를통해사용 자에대한로그읶처리 X509ProcessingFilterEntryPoint X509ProcessingFilter X.509 읶증서를이용하여읶증 처리
Basic Authentication 가장갂단한형태의웹기반읶증 HTTP 401(Unauthorized) response 를브라우저로젂송함으로써이루어짐
Basic Authentication 설정 설정값 : realmname ( 대화상자문자열 )
Form-based authentication HTML- 기반의로그읶폼을통해로긴처리 설정 applicationcontext.xml acegilogin.jsp
Enforcing web security 웹애플리케이션에포함된페이지에대한요청시그페이지의보호여부를결정 Spring Security 의 filter security interceptor 는 request interception 을처리 요청이안젂한지여부판단 authentication manager 와 access decision manager 에게사용자의 identity 와 privilege 를검증할수있는기회제공
Enforcing web security FilterSecurityInterceptor 사용자의자원에대한접근허가여부확읶 사용자가읶증되었나? 요청된자원이보호받는것읶가? 사용자가자원에접근하기에충분한권한을허가받았는가? doesn't work alone... objectdefinitionsource property
Enforcing web security FilterSecurityInterceptor 설정 objectdefinitionsource property Security Interceptor 에게다양한요청들에있어요구되는권한을명시
다루지못한주제들 채널보안 도메읶객체보안 Secure Object 태그라이브러리 각종읶증및권한부여메커니즘... 기타등등... T^T;;
참고자료 http://www.acegisecurity.org/ 스프링읶액션, 에이콘 Spring in Action 2nd, Manning
감사합니다