配置服務的安全問題會很重要,其中的內容是我自己學習的,由於學習時間不長,有可能不是很完備,如果有更好的方案,煩請評論中留言或私信,謝謝!
1. 首先訪問配置服務需要設置密碼:
使用spring-security使得這件事變得很簡單,在pom.xml中引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
在application.properties中指定用戶名和密碼,
security.user.name=user security.user.password=yourPW
如果不指定,用戶名默認是user,密碼會使用隨機密碼寫入到log中。配置客戶端也是需要提供賬號密碼才能訪問的,配置客戶端的搭建方案后面會說。
2. 大部分公司沒能力自己改造git倉庫,因此,機密性很高的配置放入git中並不安全。
配置服務提供了對配置的加密和解密,由於配置客戶端會很多,並不安全,建議將加密和解密全部放在配置服務中完成。
3. 加密配置文件內容:
Config Server 可以使用對稱(共享)密鑰或者非對稱密鑰(RSA密鑰對).就安全性來講,非對稱密鑰是優先選擇,但是,選擇對稱密鑰進行加解密處理顯得非常方便,因為,只需要簡單的配置一個屬性值.
加密使用公鑰完成,私鑰用來解密。原則上,如果你只想加密,服務器上只配置公鑰(用私鑰在本地自行解密)。實際中,建議將加密和解密全部放在配置服務中完成。原因是這種方式會把密鑰管理過程讓所有的客戶端都知道,而不是把焦點聚集在服務器上。從另外一個方面講,一個非常有益的建議是如果你的配置服務器相對不安全,只能有少數客戶端需要加密配置屬性。
加密配置:
1. 生成密鑰庫
$ keytool -genkeypair -alias mytestkey -keyalg RSA \ -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" \ -keypass changeme -keystore server.jks -storepass letmein
2. 配置配置服務配置文件
encrypt: keyStore: location: classpath:/server.jks password: letmein alias: mytestkey secret: changeme
4. 如何加密配置文件內容信息
經過上面的配置,配置服務器已經具備給配置文件內容加密與解密的能力,下面介紹如何進行加密和解密
服務器會暴露 /encrypt
和/decrypt
接口。如果你想編輯遠程配置文件,你可以請求Config Server的/encrypt
接口來加密。
逆操作也可以通過/decrypt
來完成。
你加密的值增加{cipher}
前綴后,放入配置文件中即可,從配置服務器獲取的配置會是經過自動解密的內容。
當客戶端程序對主環境資源不能確定時,/encrypt
和/decrypt
接口也接受帶有路徑形式的請求 /*/{name}/{profiles}
,這樣可以針對每個application(name)和profile進行詳細的控制加解密。
如果以這種細粒度的方式來控制加解密,你必須提供一個TextEncryptorLocator
類型的@Bean
,使用這個Bean 可以為每個名稱或profile創建不同的加密方法。默認提供的並沒有這個功能(所有加密使用相同的密鑰)。