Spring Boot Vault Integration | Secrets Management Sinhala Tutorial

ආයුබෝවන්! Spring Boot එක්ක HashiCorp Vault Secrets Management Sinhala Guide එකට ඔයාව සාදරයෙන් පිලිගන්නවා!
ඉතින් කොහොමද ඔයාලට? අද අපි කතා කරන්න යන්නේ ඔයාලා Software Engineering කරන අයට ගොඩක්ම වැදගත් වෙන, ඒ වගේම Security පැත්තෙන් හිතුවොත් නැතුවම බෑ කියන Concept එකක් ගැන - ඒ තමයි Secrets Management. විශේෂයෙන්ම අපි බලමු අපේ Java applications වලට, හරියටම කිව්වොත් Spring Boot applications වලට, HashiCorp Vault කියන නියම Tool එක කොහොමද Integrate කරගන්නේ කියලා.
Application එකක් හදනකොට අපිට Database Passwords, API Keys, Third-party Service Credentials වගේ ගොඩක් සංවේදී දේවල් (sensitive information) පාවිච්චි කරන්න වෙනවා. සමහර වෙලාවට මේවා Hardcode කරනවා, නැත්නම් Environment Variables වල තියනවා, එහෙමත් නැත්නම් Configuration Files වල තියනවා. මේ ක්රම වලින් සමහර ඒවා Temporary solution එකක් විදියට පාවිච්චි කරන්න පුළුවන් වුණාට, Production Level එකේදී මේවා ඔක්කොම Security Risks. මොකද මේවා පහසුවෙන් Hackers ලට අල්ලගන්න පුළුවන්. ඒ වගේම මේවා Manage කරන එකත් ලොකු headache එකක් වෙනවා.
ඔන්න ඔය ප්රශ්නෙට තියෙන පට්ට Solution එකක් තමයි HashiCorp Vault කියන්නේ! මේකෙන් අපිට පුළුවන් අපේ secrets ඔක්කොම Centralized විදියට, ආරක්ෂිතව ගබඩා කරලා, අවශ්ය වෙලාවට අපේ applications වලට දෙන්න. අද මේ Tutorial එකෙන් අපි මුල ඉදන්ම බලමු Vault කියන්නේ මොකක්ද, Spring Boot එක්ක ඒක සම්බන්ධ කරන්නේ කොහොමද, ඒ වගේම අපේ secrets ටික ආරක්ෂිතව Store කරලා Retrieve කරන්නේ කොහොමද කියලා. අවසානේදී ඔයාට පුළුවන් වෙයි ඔයාගේ ඊළඟ Spring Boot Project එකේදී Vault භාවිතා කරලා Security එක තවත් වැඩි කරගන්න.
HashiCorp Vault කියන්නේ මොකක්ද?
සරලවම කිව්වොත්, HashiCorp Vault කියන්නේ Secrets Management Platform එකක්. මේකෙන් අපිට පුළුවන් Password, API Keys, Certificates වගේ ඕනෑම සංවේදී දත්තයක් (secret) ආරක්ෂිතව ගබඩා කරන්න, ඒවට Access Controls දාන්න, ඒ වගේම ඒවට Access කරන විදිය Audit කරන්නත්. හිතන්න, ඔයාගේ company එකේ හැම application එකකටම වෙන වෙනම Database Password තියනවා කියලා. මේවා ඔක්කොම එක තැනකින් Manage කරන්න පුළුවන් නම් කොච්චර ලේසිද? Vault වලින් කරන්නේ ඒක තමයි.
Vault වල ප්රධාන Features කිහිපයක්:
- Secure Secret Storage: Secrets Encrypt කරලා Store කරන්න පුළුවන්.
- Dynamic Secrets: අවශ්ය වෙලාවට විතරක්, කෙටි කාලීන (short-lived) secrets Generate කරන්න පුළුවන් (උදා: Database Credentials, Cloud API Keys). මේවා පාවිච්චි කරලා ඉවර වුණාම Auto-Revoke වෙනවා.
- Data Encryption as a Service: අපි දෙන Data Encrypt/Decrypt කරන්න Vault එක පාවිච්චි කරන්න පුළුවන්, Vault එකට Data එකේ True Value එක බලන්න බැරි වෙන්න.
- Leasing and Renewal: Secrets වලට "leases" තියනවා. ඒ කියන්නේ යම්කිසි කාලයකට විතරයි ඒ secret එක වලංගු. කාලය ඉවර වුණාම Revoke වෙනවා නැත්නම් Renew කරන්න පුළුවන්.
- Audit Logging: කවුද, කවදද, කොතනින්ද secret එකකට Access කරේ කියලා වාර්තා (logs) තියාගන්න පුළුවන්.
- Authentication and Authorization: විවිධ Authentication Methods (Tokens, AppRole, LDAP, Kubernetes) පාවිච්චි කරලා Vault එකට Access කරන්න පුළුවන්. ඒ වගේම Policies දාලා කවුද මොන secret එකටද Access කරන්න පුළුවන් කියලා තීරණය කරන්න පුළුවන්.
ඔයාලා කවදාහරි application.properties
එකේ කෙලින්ම Database Password එක ලිව්වා නම්, නැත්නම් GitHub එකට Project එක Push කරනකොටත් ඒ Password එක Project Folder එකේම තිබ්බා නම්, Vault කියන්නේ ඔයාට ගොඩක් වැදගත් දෙයක්.
Spring Boot වලට Vault ඕන වෙන්නේ ඇයි?
Spring Boot කියන්නේ Microservices සහ Web Applications හදන්න දැන් ලෝකයේ ගොඩක්ම ජනප්රිය Framework එකක්. Spring Boot Application එකකදී අපිට Data Access කරන්න Database Credentials ඕනේ, Third-party Services එක්ක Integrate වෙන්න API Keys ඕනේ, Messaging Queues වලට Access කරන්න Passwords ඕනේ. මේ හැම එකක්ම සංවේදී දත්ත.
දැන් හිතන්න, ඔයාගේ application එක production වලට deploy කරනකොට මේ secrets manage කරන්නේ කොහොමද කියලා? application.properties
එකේ කෙලින්ම ලියන එක Security Risk එකක් කියල අපි කතා කළා. Environment Variables හොඳයි වගේ පෙනුණත්, ඒකත් Scalable solution එකක් නෙවෙයි. එක එක server එකක වෙන වෙනම environment variables manage කරන එක ලොකු වැඩක්.
මෙන්න මේ වෙලාවේදී තමයි Spring Cloud Vault Config අපිට පිහිටට එන්නේ! Spring Cloud Vault Config කියන්නේ Spring Cloud ecosystem එකේ තියෙන module එකක්. මේකෙන් අපේ Spring Boot Application එකට පුළුවන් HashiCorp Vault එක්ක කෙලින්ම Connect වෙලා එයාට අවශ්ය secrets ටික Auto-Load කරගන්න. ඒකෙන් අපිට ගොඩක් පහසුකම් ලැබෙනවා:
- Centralized Secrets Management: හැම secret එකක්ම Vault එකේ තියන නිසා Manage කරන්න ලේසියි.
- No Hardcoding: Code එකේ secrets hardcode කරන්න ඕනේ නෑ.
- Dynamic Configuration: අවශ්ය නම් runtime එකේදී පවා secrets වෙනස් කරන්න පුළුවන්.
- Improved Security: Secrets Encrypt වෙලා තියන නිසා ආරක්ෂාව වැඩියි.
- Auditing: කවුද මොන secret එකටද Access කරේ කියලා හරියටම දැනගන්න පුළුවන්.
නියමයි නේද? එහෙනම් අපි බලමු මේක අපේ Project එකකට Set කරගන්නේ කොහොමද කියලා.
Vault එක Spring Boot එක්ක Set කරගනිමු!
මේ Integration එකට කලින් අපිට පොඩි Pre-requisites ටිකක් තියනවා. අපි මුලින්ම Local Machine එකේ HashiCorp Vault එකක් Setup කරගමු. Development purpose එකට dev
server එකක් පාවිච්චි කරන එක ලේසියි.
පළමු පියවර: HashiCorp Vault Setup කරගැනීම
ඔයාගේ Local Machine එකට Vault Install කරගන්න ඕනේ. ඒකට පහත Link එකට ගිහින් ඔයාගේ OS එකට අදාළ Zip file එක Download කරලා, Extract කරලා, Binaries Path එකට Add කරගන්න.
https://developer.hashicorp.com/vault/downloads
Install කරලා ඉවර වුණාම, Terminal එක open කරලා පහත Command එක Run කරන්න. මේකෙන් Vault එක Development Mode එකේ Start වෙනවා.
vault server -dev
මේ Command එක Run කරපු ගමන් ඔයාට Output එකේ Vault Address එකයි (http://127.0.0.1:8200
) ඒ වගේම Root Token එකකුයි (Root Token: s.xxxxxxxxxxxxxxxxxxxx
වගේ) පෙන්වයි. මේ Root Token එක ගොඩක් වැදගත්. ඒක save කරගන්න. මේකෙන් තමයි අපිට Vault එකට Access කරන්න පුළුවන් වෙන්නේ.
දැන් අපි Vault එකට Secret එකක් දාමු. අපි Key-Value (KV) secrets engine එක පාවිච්චි කරමු. මේකෙන් අපිට Key-Value pairs විදියට secrets Store කරන්න පුළුවන්.
# KV secrets engine එක Enable කරන්න (සාමාන්යයෙන් dev server එකේ මේක default enable වෙලා තියෙන්නේ, නැත්නම් මේකෙන් කරන්න පුළුවන්)
vault secrets enable -path=secret kv
# අපේ application එකට අවශ්ය secret එකක් දාමු
# මෙතන 'my-app' කියන්නේ path එක. ඔයාට කැමති නමක් දෙන්න පුළුවන්.
vault kv put secret/my-app my.username=devuser my.password=supersecret123
නියමයි! දැන් අපේ Vault එකේ secret/my-app
කියන path එකේ my.username
සහ my.password
කියන secrets දෙක තියනවා. අපේ Spring Boot Application එකෙන් අපි මේවා තමයි Retrieve කරගන්නේ.
දෙවන පියවර: Spring Boot Project එක Setup කරගැනීම
අපි දැන් නව Spring Boot Project එකක් හදමු. ඒකට Spring Initializr පාවිච්චි කරන්න පුළුවන්. පහත Dependencies ටික Add කරගන්න:
- Spring Web (Basic web functionality)
- Spring Cloud Config Client (මේක අවශ්යයි Vault Config Client එකට)
- Spring Cloud Starter Vault Config (මේක තමයි Vault එක්ක සම්බන්ධ වෙන්න අවශ්ය ප්රධාන Dependency එක)
Maven Project එකක් නම්, ඔයාගේ pom.xml
එකේ පහත Dependencies තියෙන්න ඕනේ:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
ඔයා spring-cloud-starter-vault-config
එක Add කරනකොට, ඒක Spring Cloud ecosystem එකේ කොටසක් නිසා, spring-cloud-dependencies
කියන BOM (Bill Of Materials) එකත් Add කරන්න වෙනවා. ඒක ඔයාගේ pom.xml
එකේ <dependencyManagement>
section එකට මේ වගේ Add කරන්න:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.0</version> <!-- Replace with your Spring Cloud Version -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<version>
එක ඔයාගේ Spring Boot Version එකට ගැලපෙන Spring Cloud Version එකක් වෙන්න ඕනේ. මේක Spring Cloud Project Page එකෙන් හොයාගන්න පුළුවන්.
තෙවන පියවර: Spring Boot Configuration
Spring Boot Application එක Start වෙනකොටම Vault එකට Connect වෙන්න අවශ්ය Configuration ටික අපි src/main/resources/bootstrap.properties
(හෝ bootstrap.yml
) කියන file එකට දාන්න ඕනේ. application.properties
එකට නෙවෙයි, bootstrap.properties
එකට දාන්න ඕනේ කියන එක මතක තියාගන්න. මොකද මේ Vault configuration එක Spring Application Context එක Load වෙන්න කලින්ම Load වෙන්න ඕනේ.
bootstrap.properties
file එකට පහත දේවල් Add කරන්න:
spring.application.name=my-vault-app
# Vault Server Address
spring.cloud.vault.scheme=http
spring.cloud.vault.host=127.0.0.1
spring.cloud.vault.port=8200
# Authentication Method (development වලට token use කරනවා)
spring.cloud.vault.authentication=token
spring.cloud.vault.token=s.xxxxxxxxxxxxxxxxxxxx <-- මෙතන ඔයාට ලැබුණු Root Token එක දාන්න
# KV Secrets Engine Configuration
spring.cloud.vault.kv.enabled=true
spring.cloud.vault.kv.default-context=application
spring.cloud.vault.kv.application-name=my-vault-app
විස්තර ටිකක් බලමු:
spring.application.name=my-vault-app
: මේක තමයි අපේ application එකේ නම. Vault එකේදී secrets locate වෙන්නේ මේ නම පාවිච්චි කරලා. (අපි කලින්secret/my-app
කියල secret එක දැම්මේ මේකට තමයි)spring.cloud.vault.scheme
,spring.cloud.vault.host
,spring.cloud.vault.port
: මේවා Vault Server එකේ Address එක. Development වලට Localhost (127.0.0.1) සහ Port 8200 පාවිච්චි වෙනවා. Production වලටනම් මේවා වෙනස් වෙන්න පුළුවන්.spring.cloud.vault.authentication=token
: අපි Vault එකට authenticate වෙන්න token එකක් පාවිච්චි කරනවා. Development වලට මේක හොඳයි. Production වලට AppRole, Kubernetes වගේ වඩා ආරක්ෂිත ක්රම පාවිච්චි කරනවා.spring.cloud.vault.token=s.xxxxxxxxxxxxxxxxxxxx
: මේක තමයි ඔයාගේ Root Token එක. මේක Production වලට කිසිසේත්ම භාවිතා කරන්න එපා!. අපි මේක Development වලට විතරයි පාවිච්චි කරන්නේ.spring.cloud.vault.kv.enabled=true
: Key-Value secrets engine එක Enable කරනවා.spring.cloud.vault.kv.default-context=application
: මේකෙන් කියවෙන්නේ Spring Cloud Vault එකෙන් secrets ගන්නකොට default secret path එකේapplication
කියන prefix එකත් බලනවා.spring.cloud.vault.kv.application-name=my-vault-app
: අපේ application එකේ නමට අදාළ secret path එක (secret/my-vault-app
) බලනවා. Spring Cloud Vault Configuration එකේදී, secrets සාමාන්යයෙන්secret/{application-name}
,secret/{application-name}/{profile}
,secret/application
,secret/
වගේ paths වලින් Load වෙනවා.
Secrets Retrieve කරලා Use කරන්නේ කොහොමද?
දැන් අපි බලමු අපේ Spring Boot Application එක ඇතුලේදී Vault එකේ තියෙන secrets ටික පාවිච්චි කරන්නේ කොහොමද කියලා.
Spring Cloud Vault Config module එක තියන නිසා, Vault එකෙන් Load වෙන secrets සාමාන්ය Spring Properties වගේම අපේ Spring Environment
එකට Add වෙනවා. ඒ නිසා අපිට ඒවා සාමාන්ය විදියටම Access කරන්න පුළුවන්.
@Value
Annotation එක පාවිච්චි කිරීම:
ගොඩක් වෙලාවට අපිට මේ secrets අවශ්ය වෙන්නේ Class එකක Field එකකට Inject කරගන්න. ඒකට අපිට @Value
annotation එක පාවිච්චි කරන්න පුළුවන්.
පහත VaultDemoApplication
class එකේ උදාහරණය බලන්න. අපි CommandLineRunner
එකක් පාවිච්චි කරලා Application එක Start වෙනකොටම Secrets ටික Print කරමු.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class MyVaultAppApplication {
@Value("${my.username}")
private String username;
@Value("${my.password}")
private String password;
public static void main(String[] args) {
SpringApplication.run(MyVaultAppApplication.class, args);
}
@Bean
public CommandLineRunner runner() {
return args -> {
System.out.println("Username from Vault: " + username);
System.out.println("Password from Vault: " + password);
// System.out.println("NEVER LOG SECRETS IN PRODUCTION!!!"); // IMPORTANT: For demo only
};
}
}
දැන් ඔයාගේ Spring Boot Application එක Run කරන්න (IntelliJ, Eclipse වගේ IDE එකකින් හෝ Maven/Gradle Command එකෙන්). ඔයාට Console එකේ පහත Output එක පෙන්වන්න ඕනේ:
Username from Vault: devuser
Password from Vault: supersecret123
නියමයි! ඔයා සාර්ථකව Vault එකෙන් secrets Retrieve කරලා තියෙන්නේ. මේ secrets ඔයාගේ Code එකේ කොහේවත් Hardcode කරලා නෑ. ඒක තියෙන්නේ Vault Server එකේ. Spring Boot Application එක Start වෙනකොට Vault එකට Connect වෙලා, Authenticate වෙලා, අවශ්ය Secrets ටික Load කරගෙන තියෙන්නේ.
Environment
Object එක පාවිච්චි කිරීම:
සමහර වෙලාවට අපිට Programmatically secrets ටික Access කරන්න අවශ්ය වෙන්න පුළුවන්. ඒකට Spring Framework එකේ Environment
object එක පාවිච්චි කරන්න පුළුවන්.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
@SpringBootApplication
public class MyVaultAppApplication {
@Autowired
private Environment environment; // Environment object inject කරගන්නවා
public static void main(String[] args) {
SpringApplication.run(MyVaultAppApplication.class, args);
}
@Bean
public CommandLineRunner runner() {
return args -> {
// Environment object එකෙන් property ගන්නවා
String usernameFromEnv = environment.getProperty("my.username");
String passwordFromEnv = environment.getProperty("my.password");
System.out.println("Username from Environment: " + usernameFromEnv);
System.out.println("Password from Environment: " + passwordFromEnv);
};
}
}
මේ ක්රම දෙකම සාමාන්යයෙන් භාවිතා වෙනවා. ඔයාගේ අවශ්යතාවය අනුව ඕන එකක් පාවිච්චි කරන්න පුළුවන්.
Security Best Practices (ආරක්ෂාවට වැදගත් කරුණු)
අපි මේ Tutorial එකේදී Vault එක Development Mode එකේ Start කරලා, Root Token එක පාවිච්චි කරලා secrets retrieve කරපු නිසා මේක Production Environment එකකට කිසිසේත්ම සුදුසු නෑ. Production වලට Deploy කරනකොට පහත කරුණු ගැන සැලකිලිමත් වෙන්න:
- Authentication Methods: Production වලට Root Token භාවිතා නොකරන්න. ඒ වෙනුවට AppRole, Kubernetes Auth, AWS IAM Auth වගේ වඩා ආරක්ෂිත Authentication Methods භාවිතා කරන්න. මේවායෙන් application එකට අවශ්ය වෙලාවට විතරක්, ස්වයංක්රීයව (automatically) Vault එකට Authenticate වෙන්න පුළුවන්.
- Vault Policies: Vault එකේ Policies හදලා, application වලට අවශ්ය secrets වලට විතරක් Access දෙන්න. "Least Privilege Principle" එක අනුගමනය කරන්න. ඒ කියන්නේ, application එකකට අවශ්යම දේට විතරක් Access දෙන්න.
- Secret Rotation: Database Passwords වගේ secrets වරින් වර වෙනස් කිරීම (rotate කිරීම) ආරක්ෂාවට ගොඩක් වැදගත්. Vault එකේ Dynamic Secrets වගේ Features පාවිච්චි කරලා මේක Automate කරන්න පුළුවන්.
- TLS/SSL: Vault Server එකට Connect වෙද්දී සෑම විටම TLS/SSL (HTTPS) පාවිච්චි කරන්න. (අපි මේ Tutorial එකේදී
http
පාවිච්චි කලේ development purposes වලට). - Audit Logging: Vault එකෙන් Audit Logs Enable කරලා තියන්න. මේවා වෙනම Log Management System එකකට යවන්න. කවුද, කවදද, කොතනින්ද Vault එකට Access කරේ කියලා මේවායෙන් දැනගන්න පුළුවන්.
- Vault Unseal: Production Vault එකක් Start වෙනකොට Unseal කරන්න අවශ්ය වෙනවා. මේක Key Shares වලින් හෝ Auto-Unseal (AWS KMS, Azure Key Vault, GCP Cloud KMS වගේ) පාවිච්චි කරලා කරන්න පුළුවන්.
නිගමනය
නියමයි! අද අපි සාර්ථකව Spring Boot Application එකක් එක්ක HashiCorp Vault Integrate කරගන්න හැටි ඉගෙනගත්තා. Secrets Management කියන්නේ නූතන Software Engineering වලදී අනිවාර්යයෙන්ම අවධානය යොමු කළ යුතු ක්ෂේත්රයක්.
HashiCorp Vault වගේ Tool එකක් Spring Boot එක්ක පාවිච්චි කිරීමෙන් ඔයාට පුළුවන් ඔයාගේ Applications වල Security එක සැලකිය යුතු ලෙස වැඩි කරගන්න, ඒ වගේම Secrets Manage කරන එක ගොඩක් පහසු කරගන්න. Hardcoded Passwords, Insecure Configuration Files වලට සමුදීලා, Centralized, Secure Secrets Management එකකට මාරු වෙන්න දැන් ඔයාට පුළුවන්.
මේ Tutorial එක ඔයාට ගොඩක් වැදගත් වෙන්න ඇති කියලා හිතනවා. මතක තියාගන්න, Development Setup එක Production වලට පාවිච්චි කරන්න එපා. Production වලට යනකොට Vault එකේ Security Best Practices අනිවාර්යයෙන්ම අනුගමනය කරන්න.
මේක ඔයාගේ ඊළඟ Project එකට Implement කරලා බලන්න! මොකද Practice කරන එක තමයි වැදගත්ම දේ. ඔයාට මේ ගැන තියෙන ප්රශ්න, අත්දැකීම් පහළින් Comment කරන්න. අපි ඒ ගැන කතා කරමු!
තවත් අලුත් Technical Article එකකින් හමුවෙමු!