분산 시스템의 보안은 涉及的 요소의 多样性과 규모로 인해 複雑한 도전입니다. 다양한 서비스가 불안정한 네트워크로 인해 인가 없는 접근과 데이터 泄露 위험이 substancial히 증가합니다. 이 문서는 opensource 프로젝트를 사용한 분산 시스템의 보안을 보다 실제적으로 적용하는 방안을 탐구합니다. 이 프로젝트는 인증, 권한 부여 등의 일반적인 보안 도전을 해결하기 위해 여러 보안 기계화 및 기술을 통합하는 방법을 보여줍니다.
분산 시스템의 보안 도전
- Secure communication: 서비스 사이에 전달되는 데이터가 암호화되어 있고, wiretapping 또는 수정되는 것을 방지하는 것
- Authentication: 사용자와 서비스의 인증을 확인하여 未정의 접근을 방지하는 것
- Authorization: 인증된 사용자와 서비스가 무엇을 할 수 있는지 어느 程度上 제어하는 것, 他们的 役割과 권한에 따라
- Policy enforcement: 서비스 사이의 interactions과 사용자와의 인teractions에 대한 세부한 접근 제어와 정책을 实施하는 것입니다.
- 인증서 관리: 데이터 암호화와 서비스 간 신뢰를 위한 디지털 인증서 관리
이 오픈 소스 프로젝트는 여러 통합 기술과 솔루션을 사용하여 이러한 도전을 해결하고 있습니다.
프로젝트 세팅 및 구성
프로젝트는 shell 스크립트와 Docker를 사용하여 안전한 환경을 세팅하는 것으로 시작되며, 디지털 인증서를 provisional하고 필요한 서비스를 시작하여 모든 コンポーネン트가 安全な コミュニケーション을 위한 준비가 되었는지 확인합니다.
환경 세팅 단계
1. 인증서 제공
이 프로젝트는 shell 스크립트(provisioning.sh
)를 사용하여 인증 拒否(CA)를 simulation하고 서비스에 대한 필요한 인증서를 생성합니다.
./provisioning.sh
2. 서비스 시작
Docker Compose를 사용하여 프로젝트에 정의된 모든 서비스를 시작하고 그들이 安全한 operaion을 위한 correctly configuration되었는지 확인합니다.
docker-compose up
3. 서비스-Na-Service 通信 시험
서비스 간 通信을 인증 证书와 JWT 토큰을 사용하여 Validate하는 것을 test_services.sh
스크립트가 제공되며, 이 스크립트는 다른 서비스가 자신의 지정 인증 证书을 사용하여 안전하게 상호 작동하는 방법을 보여준다.
분산 시스템 안전성 도전
이전에 언급한 주요 안전성 도전을 해결하기 위해 프로젝트는 여러 关键技术을 통합했다. 각 도전을 어떻게 해결하는지 이 이전에 보여줍니다:
1. 분산 시스템 안전성 도전
도전
분산 시스템에서는 서비스가 인증 없이 데이터 信息公开되지 않고 안전하게 통신해야 한다.
솔루션
프로젝트는 相互 TLS (mTLS)를 사용하여 서비스 사이의 통신을 보호한다. mTLS는 klient und Server gegenseitig mit ihren jeweiligen Zertifikaten authentifizieren, was die unerlaubte Kommunikation zwischen legitimen Diensten verhindert.
구현
Nginx은 mTLS를 처리하기 위해 역 프록시로 구성되었습니다. 안전한 연결을 설정하기 위해 클라이언트와 서버 인증 이력을 필요로하며, 서비스 사이의 이전되는 데이터가 기密性和 수정 resistant가 보장됩니다.
2. Keycloak과 인증
도전
사용자와 서비스의 적절한 인증은 非授权 접근을 방지하기 critical합니다.
솔루션
프로젝트는 인증을 관리하기 위해 开源 아이디와 Acces 관리 솔루션인 Keycloak을 사용합니다. Keycloak은 OpenID Connect과 クライアント クレデンシャル 등 다양한 인증 方法을 지원하며 사용자와 서비스 인증을 위한 적절한 솔루션입니다.
- 사용자 인증:
사용자는 OpenID Connect를 사용하여 인증되며, Keycloak은 사용자 인증 流程를 처리하는 클라이언트(appTest-login-client
)와 함께 구성되어 있습니다. 이包括了 로그인, 토큰 발급 및 콜백 처리를 합니다. - 서비스 인증:
서비스-사이의 인증 할 때, 사용자 Intervention 없이 인증할 수 있는 적절한 方法인 クライアン트 クレデンシャル 지급 형태의 Keycloak 클라이언트(client_credentials-test
)를 사용합니다.
인증 流程 예시
- 사용자는 로그인 페이지로 이동합니다.
- 성공적으로 로그인하면 Keycloak는 사용자를 인가 코드를 포함한 回调 페이지로 리다이렉션합니다.
- 인가 코드는 그 后来에 JWT 토큰으로 교환되어 나后의 요청에 사용되ます.
nginx/njs
디렉터리의authn.js
파일은 이 과정의 자세한 구현을 제공합니다.
클라이언트 凭据을 사용한 서비스 인증 예
curl -X POST "http://localhost:9000/realms/tenantA/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=client_credentials-test" \
-d "client_secret=your-client-secret-here"
3. 사용자 인가를 Open Policy Agent (OPA)와 JWT로 실시하는 것
도전
인증된 사용자와 서비스가 인가 된 자원에만 액세스하도록 精細한 アクセス コントロール을 强制执行する方法
ソリューション
프로젝트는 Open Policy Agent (OPA)와 JWT 凭据의 組み合わせを 인가 ポリシーの強制実装に使用します。 프로젝트는 JWT 検証을 行う 3つ 다른 戦略를 示して、強い 安全性を確保することを示しています。
- Keycloak에서 証明書 取得: 토큰 検証のために Keycloakから 証明書を動的に取得します。
- x5t(拇指印) 사용: 토큰에 組み込まれ어 있는 拇指印을 사용하여 로컬 信頼ストアから 公钥を取得します。
- 내장 cerificate validation: 내장 cerificate를 사용하여 token을 인증하여, Cerificate Authority (CA)에 의한 cerificate의 인증이 확인되도록 합니다.
nginx/njs/token.js 파일을 참조하여 이러한 strategiues의 상세한 구현을 확인하십시오.
4. Open Policy Agent (OPA)를 사용한 정책 적용
도전
서비스와 사용자 모두에 대한 동적이고 靈活动画 접근 제어 정책 구현
솔루션
OPA는 접근 제어의 세세한 정책을 적용하기 위해 사용되며, 정책은 제안적 언어(Rego)로 쓰여지며 opa/ 디렉터리에 보관되ます. 이러한 정책은 서비스가 통신할 수 있는 조건과 사용자가 리소스를 ACCESS할 수 있는 조건을 지정하며, 시스템 내에서 접근 제어가 일관성있게 적용되도록 합니다.
5. Cerificate Management
도전
서비스에 대한 디지털 cerificate를 관리하여 신뢰를 설정하고 안전한 통신을 위한 도구를 제공합니다.
솔루션:
이 프로젝트는 강력한 Cerificate Management 시스템을 포함합니다. shell 스크립트(provisioning.sh
)를 사용하여 Certificate Authority (CA)를 Simulate하고 각 서비스에 대한 cerificate를 생성합니다. 이러한 방법은 cerificate 관리를 간단하게 하고 모든 서비스가 안전한 통신을 위한 필요한 자격 증명을 확보합니다.
또한 nginx 재시작 없이 서비스 cerificate를 更新하는 엔드포인트를 추가했습니다.
curl --insecure https://localhost/certs --cert certificates/gen/serviceA/client.crt --key certificates/gen/serviceA/client.key -F cert=@certificates/gen/serviceA/client.crt -F key=@certificates/gen/serviceA/client.key
결론
안전한 분산 시스템을 구축하기 위해서는 안전한 통신, 인증, 권한, 정책 적용 및 cerificate 관리 등 다양한 보안 측면을 신중하게 고려해야 합니다. 이 오픈 소스 프로젝트는 이러한 도전을 有效的으로 해결하기 위해 다양한 보안 기机制을 통합하는 comprehensive example를 제공합니다.
이 프로젝트에서 보여주는 세팅과 configurations를 따라하면, 개발자는 mutual TLS, Keycloak, Open Policy Agent, Nginx를 사용하여 강한 보안 구조를 설정할 수 있습니다. 이러한 기술을 결합하면 분산 시스템을 다양한 위험에 대해 강한 기반으로 보호하고 데이터 보호와 안전한 접근 제어를 Ensure할 수 있습니다.
Source:
https://dzone.com/articles/designing-a-secure-architecture-for-distributed-systems