Hero Image
[.NET] 開發階段管理應用程式的敏感資料

基於資訊安全的理由,密碼等敏感性資訊不應該出現在程式碼裡面, 應該把敏感性資料儲存在專案以外的地方,防止對 Git Server 提交專案程式碼的時候把密碼推送到伺服器上, 因此程式開發、部屬階段都應該用適當的策略存放敏感性資料讓程式讀取使用, .NET 儲存敏感性資料大致上來說可以用這兩種方式: 環境變數 Secret Manager 這裡紀錄要如何在 .NET 開發環境以 Secret 儲存敏感性資料,以及程式讀取的方式。 Secret Manager Secret Manager 就是在本地端特定路徑存放 secret.json 檔案: %APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json ~/.microsoft/usersecrets/<user_secrets_id>/secrets.json 需要先針對個別專案啟用專案的 Secret Storage 支援,切換到專案目錄執行: dotnet user-secrets init 在專案檔裡的 UserSecretsId 區段會得到一段 GUID,這個要作為 user_secrets_id 資料夾名稱。 <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId> </PropertyGroup> 以指令設置一組 secret,例如連線字串: dotnet user-secrets set "ConnectionStrings:POSTGRES" "User ID=root;Password=myPassword;Host=localhost;Port=5432;Database=myDataBase;Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;" --project "D:\workspace\MySolution\MyProject" 以檔案直接設置 secret windows type .\input.json | dotnet user-secrets set Linux/MacOS cat ./input.json | dotnet user-secrets set 在程式裡面存在 secret.

Hero Image
[K8s] 以 Secrete 共享 tnsnames.ora

Introduction Managed ODP.NET 連線資料庫標榜不需要額外安裝 Oracle Client,資料庫連線資訊可以透過: 程式內直接設定 connection string。 解析環境變數 TNS_ADMIN 所指資料夾下的 tnsnames.ora。 考慮到可維護性,一旦連線資訊有所變動(Ip/Domain/Port/Service Name/SID),如果直接將連線字串寫在程式裡面,就需要重新佈署每個程式專案, 因此如果讓 Managed ODP.NET 讀取共用的設定就能夠擁有只維護一份連線資訊的方便性。 單主機的做法是部屬 tnsnames.ora 檔案,但因為 K8S 中 pod 都是隔離的環境,要共用連線資訊透過研究可能有這幾種方式: ExternalName Service 對應外部的資料庫位址,無法因應 ip, service name, sid 修改。 Service + Endpoints 轉送 ip 和 port。 Secret Volume 共用 tnsnames.ora。 三種連線資訊共用策略是否能反映連線資訊修改: ExternalName Service Service + Endpoints Secret Volume Ip/Domain 可 可 可 Port 不能 可 可 Service Name/SID 不能 不能 可 Step Secret 用處: 作為容器的環境變數 (但只會在 pod 啟動的時候載入,無法反映動態更改) 作為檔案,可被掛載在其他 Pod 的檔案路徑下,此時 key 視為檔案名稱,value 視為檔案內容,可動態反映修改 作為 deployment 的一部分,敏感資料統一存放在 Docker image,讓其他 pod 可以 pull 存取(也無法動態反映修改,要重新 pull) 因此如果要維護 tnsnames.