Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MC-IAM-MANAGER other Framework Middleware Pkg #18

Closed
raccoon-mh opened this issue May 29, 2024 · 12 comments
Closed

MC-IAM-MANAGER other Framework Middleware Pkg #18

raccoon-mh opened this issue May 29, 2024 · 12 comments
Assignees
Labels
enhancement New feature or request

Comments

@raccoon-mh
Copy link
Member

M-CMP 내에서 사용가능한 미들웨어 패키지 개발

대상 지원 프레임워크

  • echo
  • buffalo
  • e.t.c.....

필수 요구 사항

  • isValid
  • getRole
  • getUserinfo
  • login
  • logout

환경설정

  • 호스트 설정
  • 공용키 주입
  • 개인키 생성
@raccoon-mh raccoon-mh added the enhancement New feature or request label May 29, 2024
@yunkon-kim
Copy link
Member

@innodreamer (cc. @powerkimhub, @seokho-son, @dongjae)

개발하기에 앞서서 이대로 추진해도 괜찮을지 최종 검토 및 조율이 필요할 것 같습니다.

raccoon-mh added a commit to MZC-CSC/mc-iam-manager that referenced this issue Jun 10, 2024
raccoon-mh added a commit to MZC-CSC/mc-iam-manager that referenced this issue Jun 11, 2024
raccoon-mh added a commit to MZC-CSC/mc-iam-manager that referenced this issue Jun 11, 2024
raccoon-mh added a commit to MZC-CSC/mc-web-console that referenced this issue Jun 11, 2024
@raccoon-mh
Copy link
Member Author

우선 package mcimw 로 아래와 같이 echo 및 buffalo에서 PoC 테스트 하였습니다.
필요한 기능 및 향상 이번 릴리즈 이후로 일정 조율 따로 드리겠습니다.

echo

mcimw.AuthMethod = mcimw.EnvKeycloak
mcimw.GrantedRoleList = []string{}

app.Any("/**", echo.WrapHandler(http.HandlerFunc(mcimw.BeginAuthHandler)))
app.GET("/alive/protected", mcimw.EchoMcimw(func(c echo.Context) error {
	return c.String(http.StatusOK, "alive")
}))

buffalo

mcimw.AuthMethod = mcimw.EnvKeycloak
mcimw.GrantedRoleList = []string{}
api.Use(mcimw.BuffaloMcimw)
api.GET("/{targetController}", GetRouteController)
api.POST("/{targetController}", PostRouteController)

@raccoon-mh
Copy link
Member Author

@yunkon-kim @seokho-son @dogfootman

MC-IAM-MANAGER 내에서 미들웨어 필수 함수 하기 3개에 대하여 패키지화 예정,
미들웨어는 각 프레임워크에서 직접 개발 및 echo, buffalo 등 golang 프레임워크 기반 미들웨어 예제 제공 예정

  • 공용키 주입 공통 함수

    • iam-manager에서 제공하는 certs 엔드포인트에서 JWK set을 get 하여 공용키 주입
  • 공용키를 통한 토큰 검증 함수

    • 위 공용키 주입을 통해 공용키를 가지고 토큰 Valid check
    • ** Valid check 이외 기능 제공 없음 **
  • 토큰 정보 키 기반 반환 함수

    • 토큰에서 필요한 정보를 얻기위해, KeyID map 을 넘겨 정보 반환

@raccoon-mh
Copy link
Member Author

@yunkon-kim @seokho-son @dogfootman

https://github.com/raccoon-mh/iamtokenvalidatorpoc
위 레포지토리에서 iamtokenvalidator 패키지 PoC 퍼블리싱 진행했습니다.
PoC가 어느정도 진행되고, MC-IAM-MANAGER 에서 진행하는 쪽으로 하는게 좋을 것 같습니다..
의견 부탁드립니다..!

https://github.com/raccoon-mh/mc-iam-manager-tokenValidator-middleware-PoC
Echo Framework 에서는 위 레포지토리 예제처럼 사용할 수 있을 것으로 보입니다.

아래는 echo 미들웨어 예제 입니다.

// 공용키 설정
func init() {
	// mc-iam-manager certs endpoint is require, this endpoint is v0.2.0..
	err := iamtokenvalidatorpoc.GetPubkeyIamManager("https://example.com:5000/api/auth/certs") 
	if err != nil {
		panic(err.Error())
	}
}

// token 의 valid를 확인
func isTokenValid(next echo.HandlerFunc) echo.HandlerFunc {
	return func(c echo.Context) error {
		accesstoken := strings.TrimPrefix(c.Request().Header.Get("Authorization"), "Bearer ")
		err := iamtokenvalidatorpoc.IsTokenValid(accesstoken)
		if err != nil {
			return c.String(http.StatusUnauthorized, "Authorization is not valid..")
		}
		c.Set("accesstoken", accesstoken)
		return next(c)
	}
}

// usrRole을 컨텍스트에 Set
func setUserRole(next echo.HandlerFunc) echo.HandlerFunc {
	return func(c echo.Context) error {
		accesstoken := c.Get("accesstoken").(string)
		claims, err := iamtokenvalidatorpoc.GetTokenClaimsByIamManagerClaims(accesstoken)
		if err != nil {
			return c.String(http.StatusUnauthorized, "Authorization is not valid..")
		}
		c.Set("realmAccess", claims.RealmAccess.Roles) // IAM manager 기준 현재 제공하고 있는 Role 위치. 커스텀 Claims 사용가능
		return next(c)
	}
}

@yunkon-kim
Copy link
Member

yunkon-kim commented Jul 8, 2024

@raccoon-mh (cc. @seokho-son @dogfootman)

공유해주신 Pkg 및 예제를 활용하여, cloud-barista/cb-tumblebug#1627 개선을 진행하겠습니다.
(Echo Web Framework의 공식 JWT 미들웨어에 적용 및 테스트 예정)

PoC에서 활용하신 Go version이 1.22.3으로 파악되는데요. 우선, 개발하신 패키지에서 1.22.3이 필수인지 문의드립니다.

추가로, PublicKey 획득을 위한 URL 엔트포인트로 지난번 온라인 회의에서 공유해주신, MC-IAM-MANAGER 엔트포인트를 활용할 예정입니다. 혹시 다른 엔드포인트를 사용해야할 경우, Slack DM 주시기 바랍니다.

@raccoon-mh
Copy link
Member Author

@yunkon-kim

  • 해당 패키지 1.22.3 버전 사용은 필수가 아닙니다. go.mod 수정하여 다시 올리겠습니다.

  • 현재 태그가 v0.0.0으로 잡히는데, v0.2.1 로 맞추겠습니다.

  • MC-IAM-MANAGER 엔트포인트는 지난 회의에서 드렸던 엔드포인트 활용하시면 되겠습니다.

  • 소스코드 기반 배포는 금주 내에 문서 최신화 드리겠습니다.

@yunkon-kim
Copy link
Member

yunkon-kim commented Jul 8, 2024

@raccoon-mh 확인 감사합니다!

현재 태그가 v0.0.0으로 잡히는데, v0.2.1 로 맞추겠습니다.

관련하여 말씀드립니다.

https://github.com/raccoon-mh/iamtokenvalidatorpoc 을 대상으로 통합 및 테스트를 진행하고 있습니다. Go vesion을 맞춰주시면, latest main을 활용하면 될 것 같습니다.

@raccoon-mh
Copy link
Member Author

@yunkon-kim

우선 해당 저장소로 진행하시는건가요?

PoC 패키지 테스트용으로 잠시 해놓았던 것이라, 통합하여 TB 메인 테스트로 사용하기에 부적절 할 수 있어보입니다.

진행중이시라면, https://github.com/raccoon-mh/iamtokenvalidatorpoc 를 대상으로 테그 및 go 버전 수정 하겠습니다.

--
현재 진행중인 커밋은 다음과 같습니다.
915e5de 582963e

@yunkon-kim
Copy link
Member

@raccoon-mh

위에서 PoC 진행 후, IAM-Manager에 적용하신다고 말씀해주셔서 개인 저장소 버전으로 진행하는 것으로 이해했었습니다.

TB 에 통합 및 테스트를 위한 대상을 말씀해 주시는 것이 좋을 것 같습니다.

@raccoon-mh
Copy link
Member Author

@yunkon-kim

혼선을 드려 죄송합니다...

PoC 테스트 만을 위해 해당 저장소를 제공하는 것으로 했고, TB 통합을 위해서는 M-CMP/mc-iam-manager 내부 패키지를 사용하는 것이 바람직할 것 같습니다.

테스트를 위한 준비는 끝났고, 문제 없을시 MC-IAM-MANAGER 에서 제공하는 패키지로 경로 변경하심 좋을 것 같습니다...

번거로우시다면, 현재 MC-IAM-MANAGER 패키지 테그 문제가 해결 된 이후 다시 언급드리겠습니다.
go version 및 태그를 정리중입니다.

@yunkon-kim
Copy link
Member

yunkon-kim commented Jul 8, 2024

@raccoon-mh (cc. @dogfootman @seokho-son @powerkimhub @innodreamer)

온라인 회의에서 기존 사항들을 검토 하였고, 다음과 같이 진행하는 것으로 협의되었습니다.

  • IAM-MANAGER에서 아래 3 가지 기능 및 Pkg를 제공
  • Tumblebug에서 이를 활용하여 인증 미들웨어를 구현
iamtokenvalidator.GetPubkeyIamManager("https://example.com:5000/api/auth/certs")
iamtokenvalidator.Keyfunction
iamtokenvalidator.GetTokenClaimsByIamManagerClaims(accesstoken)

Role 및 Authorization(인가)관련한 기능 및 메커니즘에 대해서는, 이후에 협의가 필요한 사항으로 남겨 놓았습니다.

아래 내용을 참고하시기 바랍니다. (혹시 다르게 설명드린 부분이 있으면, 정정하여 주시기 바랍니다.)

  • IAM-Manager에서는 "admin", "viewer", "operator" 등를 반영해 놓았고, 각 프레임워크에서 별도로 Roles를 관리하는 것으로 고려중 (예, "cb-tumblebug-admin", "cb-spider-admin" 등)
  • CB-Tumblebug에서는 Role/인가 관련한 부분은 사용자와 관련된 상위 프레임워크에서 처리되고, 인가된 사용자만 Tumblebug API를 호출할 것으로 고려중

@yunkon-kim
Copy link
Member

@raccoon-mh (cc. @dogfootman @seokho-son @powerkimhub @innodreamer)

먼저, 적극적으로 공통 기능과 Pkg를 개발 및 지원해 주셔서 감사드립니다.

MC-IAM-MANAGER에서 제공되는 JWT 관련 공통 기능 및 pkg를 활용하여,
CB-Tumblebug에 Echo용 JWT Middleware 적용 및 테스트를 완료하였습니다.

자세한 내용은 아래 PR을 참고하시기 바랍니다.

생각보다 많은 시간이 소요되었지만 유의미한 시간이었다고 생각됩니다. 공통 기능 및 Pkg 개발, 외부에서 pkg 참조를 위한 메커니즘 및 Challenging 포인트 등을 확인할 수 있었기 때문입니다.

이후, 실제로 사용하면서 몇 차례 추가 보완이 있을 것으로 예상합니다.
전체 서브시스템으로 확대 적용 시기를 정하실 때, 이점 참고하시면 될 것 같습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants