日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot加密配置属性--Spring Cloud Vault详解

發布時間:2024/3/24 javascript 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot加密配置属性--Spring Cloud Vault详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目中敏感配置信息一般需要進行加密處理,比如數據庫密碼,Spring Boot內置不提供加密支持,不能加密配置文件信息,在官方文檔中提供了自定義Environment和Spring Cloud Vault兩種解決方案。使用jasypt-spring-boot是另一種方案。

Spring Cloud Vault為HashiCorp Vault的客戶端,支持訪問HashiCorp Vault內存儲的數據,避免了在Spring Boot程序中存儲敏感數據。

本文詳細介紹了如何使用jasypt-spring-boot、Spring Cloud Vault和HashiCorp Vault,如何使用Vault的AWS Secret、Database Secret、AWS EC2認證和AWS IAM認證。

自定義Environment
1自己實現加解密的方法,在配置文件中使用密文,比如:

spring:datasource:password: a3Ehaf0f/S1Rt6JfOGfQ+w== jwt:secret: a3Ehaf0f/S1Rt6JfOGfQ+w==

2實現EnvironmentPostProcessor,在其中執行解密操作,簡單示例如下:

package org.itrunner.heroes.config;import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.boot.env.OriginTrackedMapPropertySource; import org.springframework.boot.env.YamlPropertySourceLoader; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.PropertySource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource;import java.io.IOException; import java.util.Map;public class DecryptedEnvironmentPostProcessor implements EnvironmentPostProcessor {private final YamlPropertySourceLoader loader = new YamlPropertySourceLoader();@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {Resource path = new ClassPathResource("config.yml");PropertySource<Map<String, Object>> propertySource = loadYaml(path);environment.getPropertySources().addLast(propertySource);}private PropertySource<Map<String, Object>> loadYaml(Resource path) {if (!path.exists()) {throw new IllegalArgumentException("Resource " + path + " does not exist");}try {OriginTrackedMapPropertySource propertySource = (OriginTrackedMapPropertySource) loader.load("custom-resource", path).get(0);return new DecryptedMapPropertySource(propertySource);} catch (IOException ex) {throw new IllegalStateException("Failed to load yaml configuration from " + path, ex);}}private static class DecryptedMapPropertySource extends MapPropertySource {public DecryptedMapPropertySource(OriginTrackedMapPropertySource propertySource) {super(propertySource.getName(), propertySource.getSource());}@Overridepublic Object getProperty(String name) {Object value = super.getProperty(name);if (value instanceof CharSequence) {// 執行解密,返回明文return "DecryptedValue";}return value;}}}

自定義的EnvironmentPostProcessor需在META-INF/spring.factories內注冊:

org.springframework.boot.env.EnvironmentPostProcessor=org.itrunner.heroes.config.DecryptedEnvironmentPostProcessor

Jasypt Spring Boot
集成jasypt-spring-boot
有三種方式集成jasypt-spring-boot:

項目中如使用了@SpringBootApplication或@EnableAutoConfiguration,簡單地添加jasypt-spring-boot-starter到classpath將在整個Spring環境中啟用加密屬性

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>2.1.0</version> </dependency>

添加jasypt-spring-boot到classpath,添加@EnableEncryptableProperties到main Configuration class將在整個Spring環境中啟用加密屬性

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot</artifactId><version>2.1.0</version> </dependency> @Configuration @EnableEncryptableProperties public class MyApplication {... }

添加jasypt-spring-boot到classpath,使用@EncrytablePropertySource聲明加密的屬性或YAML文件

@Configuration @EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties") public class MyApplication {... }

或者使用@EncryptablePropertySources:

@Configuration @EncryptablePropertySources({@EncryptablePropertySource("classpath:encrypted.properties"),@EncryptablePropertySource("file:/path/to/encrypted2.properties")}) public class MyApplication {.... }

加密配置

默認,加密算法為PBEWithMD5AndDES,加解密bean name為jasyptStringEncryptor,加密的數據需使用ENC()包裹。
所有這些屬性都可在配置文件中聲明,但加密密碼不應存儲在配置文件中,而應使用系統屬性、命令行參數傳入,只要名稱為jasypt.encryptor.password即可:

java -jar jasypt-spring-boot-demo.jar --jasypt.encryptor.password=password 或 java -Djasypt.encryptor.password=password -jar jasypt-spring-boot-demo.jar

也可在application.properties 或 application.yml中使用環境變量:

jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}

配置文件示例:

spring:jpa:database-platform: org.hibernate.dialect.PostgreSQLDialecthibernate:ddl-auto: updateproperties:hibernate:default_schema: heroesformat_sql: truejdbc:lob:non_contextual_creation: trueshow-sql: truedatasource:platform: postgresqldriver-class-name: org.postgresql.Driverurl: jdbc:postgresql://localhost:5432/postgresusername: heropassword: ENC(a3Ehaf0f/S1Rt6JfOGfQ+w==)initialization-mode: never jasypt:encryptor:algorithm: PBEWithMD5AndDESpassword: 1qefhQH7mRR4LADVettRstringOutputType: base64property:prefix: ENC(suffix: )

生成加密數據
使用CLI工具JasyptPBEStringEncryptionCLI生成加密數據,如下:

java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="inputdata" password=secretkey algorithm=PBEWithMD5AndDES

執行后,輸出如下:

----ENVIRONMENT-----------------Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.191-b12 ----ARGUMENTS-------------------algorithm: PBEWithMD5AndDES input: hero password: 1qefhQH7mRR4LADVettR----OUTPUT----------------------a3Ehaf0f/S1Rt6JfOGfQ+w==

生成后,使用ENC(密文)替換明文數據即可。

HashiCorp Vault
HashiCorp Vault提供集中管理機密(Secret)和保護敏感數據的服務,可通過UI、CLI或HTTP API訪問。HashiCorp Vault使用GO語言編寫。

初識HashiCorp Vault
安裝HashiCorp Vault
根據您的系統下載HashiCorp Vault,然后解壓zip包,其中為一可執行文件。

以linux系統為例:

$ unzip vault_1.0.2_linux_amd64.zip $ sudo chown root:root vault $ sudo chmod 755 vault $ sudo mv vault /usr/local/bin/ $ vault --version

幫助
直接運行vault可查看支持的命令:

$ vault Usage: vault <command> [args]Common commands:read Read data and retrieves secretswrite Write data, configuration, and secretsdelete Delete secrets and configurationlist List data or secretslogin Authenticate locallyagent Start a Vault agentserver Start a Vault serverstatus Print seal and HA statusunwrap Unwrap a wrapped secretOther commands:audit Interact with audit devicesauth Interact with auth methodskv Interact with Vault's Key-Value storagelease Interact with leasesnamespace Interact with namespacesoperator Perform operator-specific taskspath-help Retrieve API help for pathsplugin Interact with Vault plugins and catalogpolicy Interact with policiessecrets Interact with secrets enginesssh Initiate an SSH sessiontoken Interact with tokens

運行 vault [command] [subcommand] -h可查看命令支持的參數。

path-help 查看系統、Secret引擎、認證方法等路徑支持的配置,在實際應用中經常用到。比如:

$ vault path-help sys/ $ vault path-help database/ $ vault path-help database/roles $ vault path-help aws/ $ vault path-help auth/token/ $ vault path-help auth/aws/

說明:要啟用相應功能才能查看路徑。

自動完成
linux下,Vault支持命令自動完成功能,安裝后輸入vault [tab]會顯示命令提示,需執行以下命令安裝:

$ vault -autocomplete-install $ exec $SHELL

安裝后將在~/.bashrc內添加如下內容:

complete -C /usr/local/bin/vault vault

dev模式啟動Vault
以dev模式啟動不需任何配置,數據保存在內存中。

$ vault server -dev

控制臺輸出如下內容:

==> Vault server configuration:Api Address: http://127.0.0.1:8200Cgo: disabledCluster Address: https://127.0.0.1:8201Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")Log Level: (not set)Mlock: supported: true, enabled: falseStorage: inmemVersion: Vault v1.0.1Version Sha: 08df121c8b9adcc2b8fd55fc8506c3f9714c7e61WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory and starts unsealed with a single unseal key. The root token is already authenticated to the CLI, so you can immediately begin using Vault.You may need to set the following environment variable:$ export VAULT_ADDR='http://127.0.0.1:8200'The unseal key and root token are displayed below in case you want to seal/unseal the Vault or re-authenticate.Unseal Key: xSahEjtRQMMwbyBW6+rIzE2RRJ4d8X7BmAyPsSk63yE= Root Token: s.5bnclu8POKx2WCxETB4u8RqFDevelopment mode should NOT be used in production installations!

其中,Unseal Key、Root Token要保存下來。以dev模式啟動Vault其狀態是unseal的,不需要使用Unseal Key解封服務器。訪問Vault需要使用Root Token。建議將Vault服務器地址保存到環境變量VAULT_ADDR中,否則使用命令行訪問vault時需要指定-address參數。

查看Vault Server狀態:

$ vault status -address=http://127.0.0.1:8200

說明:-address默認為https://127.0.0.1:8200

登錄Vault
從瀏覽器登錄Vault,在地址欄輸入http://localhost:8200 :

在Token文本框內輸入“Root Token”,進入Vault主界面:

從命令行登錄Vault:

$ vault login -method=token -address=http://127.0.0.1:8200 Token (will be hidden): Success! You are now authenticated. The token information displayed below is already stored in the token helper. You do NOT need to run "vault login" again. Future Vault requests will automatically use this token.Key Value --- ----- token s.1Pv48heTmZhXjm0bBd84Muef token_accessor 3gfMlTXFPHX3ehMQzkJUrk3o token_duration ∞ token_renewable false token_policies ["root"] identity_policies [] policies ["root"]

認證方法
Vault支持多種登錄認證方式,默認啟用了token方式。

從命令行查看啟用的認證方法:

$ vault auth list Path Type Accessor Description ---- ---- -------- ----------- token/ token auth_token_cd421269 token based credentials

Secret引擎
Vault支持多種Secret引擎,一些引擎只是存儲和讀取數據,如kv;一些引擎連接到其他服務并根據需要生成動態憑據,如AWS、database;一些引擎提供加密服務(如transit)、證書生成(如pki)等。默認啟用了kv(Key-Value)和cubbyhole引擎。

從命令行查看啟用的Secret引擎:

$ vault secrets list Path Type Accessor Description ---- ---- -------- ----------- cubbyhole/ cubbyhole cubbyhole_835f8a75 per-token private secret storage identity/ identity identity_0ba84c63 identity store secret/ kv kv_9558dfb7 key/value secret storage sys/ system system_5f7114e7 system endpoints used for control, policy and debugging

我們在kv引擎secret下創建一secret供后面測試使用,如下:

也可以使用命令行:

$ vault kv put secret/heroes-api hello=coco

查詢secret:

$ vault kv get secret/heroes-api

部署HashiCorp Vault
之前使用dev模式啟動Vault,接下來說明真實環境如何配置。

配置Vault
以非dev模式啟動Vault必須提供至少一個配置文件,下面創建配置文件vault.hcl:

$ sudo mkdir --parents /etc/vault.d $ sudo touch /etc/vault.d/vault.hcl $ sudo chown --recursive ec2-user:ec2-user /etc/vault.d $ sudo chmod 640 /etc/vault.d/vault.hcl

配置文件支持HCL (HashiCorp Configuration Language)和JSON格式,vault.hcl內容如下:

ui = truestorage "file" {path = "/usr/vault/data" }listener "tcp" {address = "0.0.0.0:8200"tls_cert_file = "/etc/vault.d/cert.pem"tls_key_file = "/etc/vault.d/privkey.pem" }api_addr = "https://10.188.12.119:8200"

參數:

ui 是否啟用UI,默認為false`
storage 物理存儲方式,支持以下的類型:azure、cassandra、cockroachdb、consul、couchdb、dynamodb、etcd、file、foundationdb、spanner、gcs、inmem、manta、mssql、mysql、postgresql、s3、swift、zookeeper
listener 監聽器,可以配置一個或多個
api_addr 在集群環境中使用,指定向集群中的其他vault服務器公布的URL,以供客戶端重定向。也可以通過環境變量VAULT_API_ADDR設定
生成自簽名證書:

$ openssl genrsa -out privkey.pem $ openssl req -x509 -new -key privkey.pem -out cert.pem -days 365 -subj /C=CN/ST=Beijing/L=Beijing/CN=vault.itrunner.org/OU=itrunner/O=itrunner/emailAddress=sjc-925@163.com

使用自簽名證書時需要配置環境變量VAULT_CACERT:

$ export VAULT_CACERT='/etc/vault.d/cert.pem'

Spring Cloud Vault通過HTTPS協議訪問Vault時需配置客戶端證書,執行以下命令將cert.pem導入到keystore中:

$ keytool -importcert -keystore keystore.jks -file cert.pem -noprompt -storepass changeit -alias heroes

測試啟動Vault
啟動前先授權vault使用mlock syscall:

$ sudo setcap cap_ipc_lock=+ep /usr/local/bin/vault

否則會顯示如下錯誤:

Error initializing core: Failed to lock memory: cannot allocate memoryThis usually means that the mlock syscall is not available. Vault uses mlock to prevent memory from being swapped to disk. This requires root privileges as well as a machine that supports mlock. Please enable mlock on your system or disable Vault from using it. To disable Vault from using it, set the `disable_mlock` configuration option in your configuration file.

啟動Vault:

$ vault server -config=/etc/vault.d/vault.hcl

配置Vault服務
kill掉上面的vault進程,配置vault為系統服務。
創建vault.service:

$ sudo touch /etc/systemd/system/vault.service

內容如下:

[Unit] Description="HashiCorp Vault - A tool for managing secrets" Documentation=https://www.vaultproject.io/docs/ Requires=network-online.target After=network-online.target ConditionFileNotEmpty=/etc/vault.d/vault.hcl[Service] User=ec2-user Group=ec2-user SecureBits=keep-caps AmbientCapabilities=CAP_IPC_LOCK Capabilities=CAP_IPC_LOCK+ep CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK ExecStart=/usr/local/bin/vault server -config=/etc/vault.d/vault.hcl ExecReload=/bin/kill --signal HUP $MAINPID KillMode=process KillSignal=SIGINT Restart=on-failure RestartSec=5 TimeoutStopSec=30 StartLimitIntervalSec=60 StartLimitBurst=3[Install] WantedBy=multi-user.target

啟動Vault:

$ sudo systemctl enable vault $ sudo systemctl start vault $ sudo systemctl status vault

初始化Vault
首次啟動vault后需要執行初始化操作。

$ vault operator init

初始化后生成加密key、unseal key、Initial Root Token,這些數據要保存到安全的地方。

Unseal Key 1: 1OlGbwCZ/y4IeULDGWdi1x3I4weOil8sWanlZ5M3gUN8 Unseal Key 2: LwILr0IuyKLwpooN8d7C6mQPr/AuzqzMq20RhKQlw8gR Unseal Key 3: OMr0B1n4ugZErUWzwsoA3rFZw3v3nsJM5oQWocgr9SYo Unseal Key 4: a1m2Wbz+tlv1e7cTsidXKa1Yt/DTbzaFJlza2s/khUau Unseal Key 5: ZuL66Av5SOH9gYLii2VHec6CcWUktXk99qabWfcSAF9HInitial Root Token: s.1Pv48heTmZhXjm0bBd84MuefVault initialized with 5 key shares and a key threshold of 3. Please securely distribute the key shares printed above. When the Vault is re-sealed, restarted, or stopped, you must supply at least 3 of these keys to unseal it before it can start servicing requests.Vault does not store the generated master key. Without at least 3 key to reconstruct the master key, Vault will remain permanently sealed!It is possible to generate new unseal keys, provided you have a quorum of existing unseal keys shares. See "vault operator rekey" for more information.

Seal/Unseal
初始化后Vault Server處于封印狀態,因不知如何解密存儲的數據,所以不能讀取。初始化輸出的內容中“Vault initialized with 5 key shares and a key threshold of 3”,意味著為了解封需要5個key中的3個,執行解封命令如下:

$ vault operator unseal

選取3個key,執行3次上面的命令直到Sealed狀態為false:

Unseal Key (will be hidden): Key Value --- ----- Seal Type shamir Initialized true Sealed false Total Shares 5 Threshold 3 Version 1.0.1 Cluster Name vault-cluster-654a8704 Cluster ID 91e5ea90-1a78-45c8-36f6-99a0ba7b5eec HA Enabled false

登錄Vault
使用Initial Root Token登錄Vault:

$ vault login s.1Pv48heTmZhXjm0bBd84Muef

登錄成功后,輸出如下結果:

Success! You are now authenticated. The token information displayed below is already stored in the token helper. You do NOT need to run "vault login" again. Future Vault requests will automatically use this token.Key Value --- ----- token s.1Pv48heTmZhXjm0bBd84Muef token_accessor 3gfMlTXFPHX3ehMQzkJUrk3o token_duration ∞ token_renewable false token_policies ["root"] identity_policies [] policies ["root"]

root用戶可以重新封印Vault:

$ vault operator seal

Vault支持集群部署,更多內容請查閱官方文檔。

Token和Policy管理
Root Token具有最高權限,最佳實踐不應存儲Root Token,僅在必要時使用vault operator generate-root命令生成,用畢撤銷token。
撤銷token

$ vault token revoke -self

生成Root Token

初始化Root Token,生成one-time password (OTP)、Nonce

$ vault operator generate-root -init A One-Time-Password has been generated for you and is shown in the OTP field. You will need this value to decode the resulting root token, so keep it safe. Nonce 94e81220-dc59-16c5-1f08-180551cfa158 Started true Progress 0/3 Complete false OTP kVpqIjLf7BZQgNUbEBAuQPikRk OTP Length 26

生成Root Token

$ vault operator generate-root Operation nonce: 94e81220-dc59-16c5-1f08-180551cfa158 Unseal Key (will be hidden): Nonce 94e81220-dc59-16c5-1f08-180551cfa158 Started true Progress 1/3 Complete false

需要輸入3次Unseal Key,成功后將輸出Encoded Token:

Encoded Token GHhHHBovfg9dEQAiASNhFiEFMT0DOjw+Gx4

解碼Token

$ vault operator generate-root -decode=GHhHHBovfg9dEQAiASNhFiEFMT0DOjw+Gx4 -otp=kVpqIjLf7BZQgNUbEBAuQPikRk

創建Token,設定有效時間,不指定policy

$ vault token create -ttl 10m Key Value --- ----- token s.8DibgV8wlTJq3ygtcfK4ne2K token_accessor NuElYtSnxF51JXli3LC6XKHM token_duration 10m token_renewable true token_policies ["root"] identity_policies [] policies ["root"]

新token為當前使用token的子token,權限繼承自當前使用的token。

過期后可renew token:

vault token renew s.8DibgV8wlTJq3ygtcfK4ne2K

創建Token,指定Policy
Policy有如下幾種權限:

# This section grants all access on "secret/*". Further restrictions can be # applied to this broad policy, as shown below. path "secret/*" {capabilities = ["create", "read", "update", "delete", "list"] }# Even though we allowed secret/*, this line explicitly denies # secret/super-secret. This takes precedence. path "secret/super-secret" {capabilities = ["deny"] }

創建策略文件,僅允許讀取路徑secret/heroes-api:

$ vi heroes-policy.hcl

內容如下:

path "secret/heroes-api" {capabilities = ["read"] }

上傳策略:

$ vault policy write heroes heroes-policy.hcl

使用新策略創建Token:

$ vault token create -policy=heroes Key Value --- ----- token s.1bJDHR7VuSaHfquqmoQREioA token_accessor FGufmiTSqWcEaiZAg9nuLkvx token_duration 768h token_renewable true token_policies ["default" "heroes"] identity_policies [] policies ["default" "heroes"]

默認duration為768h,policy為"default" “heroes”。
使用新token登錄,查看secret:

$ vault login s.1bJDHR7VuSaHfquqmoQREioA $ vault kv get secret/heroes-api

AWS Secret引擎
使用AWS Secret引擎,每次訪問創建新的AWS用戶和登錄憑證(訪問密鑰),Vault并不存儲憑證。

啟用AWS Secret引擎

$ vault secrets enable aws Success! Enabled the aws secrets engine at: aws/

配置AWS賬戶

$ vault write aws/config/root access_key=VKIAJBRHKH6EVTTNXDHA secret_key=vCtSM8ZUEQ3mOFVlYPBQkf2sO6F/W7a5TVzrl3Oj region=cn-north-1 Success! Data written to: aws/config/root

說明,可使用vault path-help命令查看路徑配置:

$ vault path-help aws/

創建Role
配置Vault創建的AWS用戶的角色:

$ vault write aws/roles/my-role \credential_type=iam_user \policy_document=-<<EOF {"Version": "2012-10-17","Statement": [{"Sid": "Stmt1426528957000","Effect": "Allow","Action": ["ec2:*"],"Resource": ["*"]}] } EOF Success! Data written to: aws/roles/my-role

生成密鑰

$ vault read aws/creds/my-role Key Value --- ----- lease_id aws/creds/my-role/0bce0782-32aa-25ec-f61d-c026ff22106e lease_duration 768h lease_renewable true access_key VKIAJBRHKH6EVTTNXDHA secret_key vCtSM8ZUEQ3mOFVlYPBQkf2sO6F/W7a5TVzrl3Oj security_token <nil>

成功執行以上命令后可通過AWS IAM控制臺查看新創建的用戶。

renew和revoke
可使用lease_id來執行renew、revoke操作,執行revoke后將刪除AWS用戶:

$ vault lease revoke aws/creds/my-role/0bce0782-32aa-25ec-f61d-c026ff22106

Database Secret引擎
使用Database Secret引擎可動態創建數據庫用戶并授權。目前支持的數據庫有Cassandra、HANA、MongoDB、MSSQL、MySQL/MariaDB、PostgreSQL、Oracle。

啟用Database Secret引擎

$ vault secrets enable database

配置數據庫插件和連接URL

$ vault write database/config/my-postgresql-database plugin_name=postgresql-database-plugin allowed_roles="my-role" \ connection_url="postgresql://{{username}}:{{password}}@localhost:5432?sslmode=disable" \ username="postgres" password="postgres"

參數:
plugin_name 插件名稱,使用postgresql數據庫
allowed_roles 允許使用的vault角色
用戶名、密碼要使用模板。

可執行以下命令查看參數說明:

$ vault path-help database/config/my-postgresql-database

創建角色
角色用來定義創建數據庫用戶和授權的腳本:

$ vault write database/roles/my-role db_name=my-postgresql-database \creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \default_ttl="1h" max_ttl="24h" Success! Data written to: database/roles/my-role

{{name}}和{{password}}將動態生成。

創建數據庫用戶

$ vault read database/creds/my-role Key Value --- ----- lease_id database/creds/my-role/789xpa9Rg3vVosLDMaTJKDnT lease_duration 1h lease_renewable true password A1a-PLaakX5RdWS5Wb7t username v-root-my-role-4sXjeClqaYXQF10lms8F-1547715152

AWS認證
AWS認證方法提供了一種自動索取Vault token的機制,支持EC2和IAM兩種方式。

EC2認證,AWS被視為受信任的第三方,使用唯一代表每個ec2實例的加密簽名動態元數據信息進行身份驗證,僅適用于EC2實例。

IAM認證,使用AWS IAM憑據簽名的AWS請求進行身份驗證,IAM憑據可來自IAM User、IAM Role,適用于EC2實例、Lambda函數及其他提供AWS憑據的環境。推薦使用IAM認證。

啟用AWS認證

$ vault auth enable aws

配置AWS賬戶和終端節點
根據您使用的AWS區域選擇終端節點,AWS區域和終端節點。

$ vault write auth/aws/config/client access_key=VKIAJBRHKH6EVTTNXDHA secret_key=vCtSM8ZUEQ3mOFVlYPBQkf2sO6F/W7a5TVzrl3Oj \ endpoint=https://ec2.cn-north-1.amazonaws.com.cn iam_endpoint=https://iam.cn-north-1.amazonaws.com.cn \ sts_endpoint=https://sts.cn-north-1.amazonaws.com.cn \ iam_server_id_header_value=vault.itrunner.org

配置角色策略
角色配置中至少含有一種約束條件。

EC2認證

$ vault write auth/aws/role/dev-role auth_type=ec2 bound_ami_id=ami-04f306762a9e9a056 policies=heroes max_ttl=768h

IAM User認證

$ vault write auth/aws/role/dev-role-iam-user auth_type=iam bound_iam_principal_arn=arn:aws-cn:iam::123456789012:user/test policies=heroes max_ttl=768h

登錄時僅需提供User訪問密鑰。

IAM Role認證
下例適用于EC2實例,inferred_entity_type為ec2_instance,認證的EC2需要授予IAM角色并符合約束條件。

$ vault write auth/aws/role/dev-role-iam auth_type=iam inferred_entity_type=ec2_instance inferred_aws_region=cn-north-1 bound_ami_id=ami-04f306762a9e9a056 bound_iam_principal_arn=arn:aws-cn:iam::123456789012:role/MyRole policies=heroes max_ttl=768h

EC2認證登錄
EC2認證需要驗證簽名,需要配置region的公有證書。
中國(北京)地區的 AWS 公有證書如下:

-----BEGIN CERTIFICATE----- MIIDNjCCAh5CCQD3yZ1w1AVkTzANBgkqhkiG9w0BAQsFADBcMQswCQYDVQQGEwJV UzEZMBcGA1UECBMQV2FzaGluZ3RvbiBTdGF0ZTEQMA4GA1UEBxMHU2VhdHRsZTEg MB4GA1UEChMXQW1hem9uIFdlYiBTZXJ2aWNlcyBMTEMwIBcNMTUwNTEzMDk1OTE1 WhgPMjE5NDEwMTYwOTU5MTVaMFwxCzAJBgNVBAYTAlVTMRkwFwYDVQQIExBXYXNo aW5ndG9uIFN0YXRlMRAwDgYDVQQHEwdTZWF0dGxlMSAwHgYDVQQKExdBbWF6b24g V2ViIFNlcnZpY2VzIExMQzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AMWk9vyppSmDU3AxZ2Cy2bvKeK3F1UqNpMuyeriizi+NTsZ8tQqtNloaQcqhto/l gsw9+QSnEJeYWnmivJWOBdn9CyDpN7cpHVmeGgNJL2fvImWyWe2f2Kq/BL9l7N7C P2ZT52/sH9orlck1n2zO8xPi7MItgPHQwu3OxsGQsAdWucdxjHGtdchulpo1uJ31 jsTAPKZ3p1/sxPXBBAgBMatPHhRBqhwHO/Twm4J3GmTLWN7oVDds4W3bPKQfnw3r vtBj/SM4/IgQ3xJslFcl90TZbQbgxIi88R/gWTbs7GsyT2PzstU30yLdJhKfdZKz /aIzraHvoDTWFaOdy0+OOaECAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAdSzN2+0E V1BfR3DPWJHWRf1b7zl+1X/ZseW2hYE5r6YxrLv+1VPf/L5I6kB7GEtqhZUqteY7 zAceoLrVu/7OynRyfQetJVGichaaxLNM3lcr6kcxOowb+WQQ84cwrB3keykH4gRX KHB2rlWSxta+2panSEO1JX2q5jhcFP90rDOtZjlpYv57N/Z9iQ+dvQPJnChdq3BK 5pZlnIDnVVxqRike7BFy8tKyPj7HzoPEF5mh9Kfnn1YoSVu+61lMVv/qRjnyKfS9 c96nE98sYFj0ZVBzXw8Sq4Gh8FiVmFHbQp1peGC19idOUqxPxWsasWxQXO0azYsP 9RyWLHKxH1dMuA== -----END CERTIFICATE-----

將其保存在文件AWSpubkey中,然后執行下面命令導入證書:

$ vault write auth/aws/config/certificate/cn-cert aws_public_cert="$(cat AWSpubkey)"

說明:cn-cert為證書名稱。

首次EC2認證時執行如下命令:

$ vault write auth/aws/login role=dev-role \ pkcs7="$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/pkcs7 | tr -d '\n')"

輸出如下結果:

Key Value --- ----- token s.zVo29eIEkbdtpitFc3r5bjc3 token_accessor v1ZFeHEQyWidnCiLNLHs5lA7 token_duration 768h token_renewable true token_policies ["default" "heroes"] identity_policies [] policies ["default" "heroes"] token_meta_account_id 123456789012 token_meta_ami_id ami-03dc01372eae510e2 token_meta_instance_id i-015f7488c627dff71 token_meta_nonce dba47cd8-06ad-9de0-7fee-34b977409bc4 token_meta_region cn-north-1 token_meta_role dev-role token_meta_role_tag_max_ttl 0s

其中包含token、token_meta_nonce等,token權限為[“default” “heroes”]。

再次登錄時需要提供nonce:

$ vault write auth/aws/login role=dev-role \ pkcs7="$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/pkcs7 | tr -d '\n')" \ nonce=dba47cd8-06ad-9de0-7fee-34b977409bc4

IAM認證登錄
IAM認證,Vault使用了AWS GO SDK,需要指定AWS Region:

$ export AWS_REGION=cn-north-1

也可以設置環境變量AWS_SDK_LOAD_CONFIG為true,這樣可以從.aws文件夾讀取配置:

$ export AWS_SDK_LOAD_CONFIG=true

執行IAM User認證:

$ vault login -method=aws header_value=vault.itrunner.org role=dev-role-iam-user aws_access_key_id=ASIAIOSFODNN7EXAMPLE aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

訪問密鑰可以在命令行提供,也可以從.aws文件夾讀取。輸出如下結果:

Success! You are now authenticated. The token information displayed below is already stored in the token helper. You do NOT need to run "vault login" again. Future Vault requests will automatically use this token.Key Value --- ----- token s.zVo29eIEkbdtpitFc3r5bjc3 token_accessor v1ZFeHEQyWidnCiLNLHs5lA7 token_duration 768h token_renewable true token_policies ["default" "heroes"] identity_policies [] policies ["default" "heroes"] token_meta_inferred_aws_region n/a token_meta_inferred_entity_id n/a token_meta_inferred_entity_type n/a token_meta_account_id 123456789012 token_meta_auth_type iam token_meta_canonical_arn arn:aws-cn:iam::123456789012:user/test token_meta_client_arn arn:aws-cn:iam::123456789012:user/test token_meta_client_user_id AROAPQVNYAPQTLNZVYUL9

執行IAM Role認證:

$ vault login -method=aws header_value=vault.itrunner.org role=dev-role-iam

輸出如下結果:

Success! You are now authenticated. The token information displayed below is already stored in the token helper. You do NOT need to run "vault login" again. Future Vault requests will automatically use this token.Key Value --- ----- token s.zVo29eIEkbdtpitFc3r5bjc3 token_accessor v1ZFeHEQyWidnCiLNLHs5lA7 token_duration 768h token_renewable true token_policies ["default" "heroes"] identity_policies [] policies ["default" "heroes"] token_meta_inferred_aws_region cn-north-1 token_meta_inferred_entity_id i-0744e18eb21c22cc1 token_meta_inferred_entity_type ec2_instance token_meta_account_id 123456789012 token_meta_auth_type iam token_meta_canonical_arn arn:aws-cn:iam::123456789012:role/MyRole token_meta_client_arn arn:aws-cn:sts::123456789012:assumed-role/MyRole/i-0744e18eb21c22cc1 token_meta_client_user_id AROAPQVNYAPQTLNZVYUL9

若未指定AWS Region,會輸出如下錯誤:

Error authenticating: Error making API request.URL: PUT https://vault.itrunner.org:8200/v1/auth/aws/login Code: 400. Errors:* error making upstream request: received error code 403 from STS: <ErrorResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/"><Error><Type>Sender</Type><Code>SignatureDoesNotMatch</Code><Message>Credential should be scoped to a valid region, not 'us-east-1'. </Message></Error><RequestId>82c67acf-2e8e-11e9-a251-03d652cb82bc</RequestId> </ErrorResponse>

Spring Cloud Vault
快速開始
POM配置
在POM中配置Spring Cloud Vault依賴:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-vault-dependencies</artifactId><version>2.1.0.RELEASE</version><scope>import</scope><type>pom</type></dependency></dependencies> </dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-vault-config</artifactId></dependency> </dependencies>

bootstrap配置
Spring Cloud Vault配置支持bootstrap.properties、bootstrap.yml兩種格式。在項目resources目錄下創建bootstrap.yml文件,內容如下:

spring:application:name: heroes-apicloud:vault:application-name: heroes-apihost: vault.itrunner.orgport: 8200scheme: httpsauthentication: TOKENtoken: s.1Rkb4yNR5WYawHLcdpYxzroxconnection-timeout: 5000read-timeout: 15000config:order: -10ssl:trust-store: classpath:keystore.jkstrust-store-password: changeitkv:enabled: truebackend: secretprofile-separator: /default-context: applicationapplication-name: heroes-api

參數含義:
authentication: TOKEN 設置認證方式,Spring Cloud Vault支持的認證方式有:TOKEN, APPID, APPROLE, AWS_EC2, AWS_IAM, AZURE_MSI, CERT, CUBBYHOLE, GCP_GCE, GCP_IAM, KUBERNETES
kv.enabled: true 訪問kv引擎數據
kv.backend: secret 設置secret的路徑

Spring Cloud Vault從以下路徑查找secret屬性數據:

/secret/{application}/{profile} /secret/{application} /secret/{default-context}/{profile} /secret/{default-context}

application名字由以下配置屬性決定:

spring.cloud.vault.kv.application-name spring.cloud.vault.application-name spring.application.name

使用https協議時需配置trust-store。

訪問在HashiCorp Vault中存儲的值
訪問方式與讀取Spring Boot配置文件屬性相同,以下代碼則會讀取/secret/heroes-api/hello值:

@Value("${hello}") String name;

AWS Secret后端
從HashiCorp Vault AWS Secret引擎獲取憑證,需增加spring-cloud-vault-config-aws依賴:

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-vault-config-aws</artifactId><version>2.1.0.RELEASE</version></dependency> </dependencies>

增加如下配置啟用AWS后端:

spring.cloud.vault:aws:enabled: truerole: my-rolebackend: awsaccess-key-property: cloud.aws.credentials.accessKeysecret-key-property: cloud.aws.credentials.secretKey

參數:
role AWS Secret引擎中的角色名稱
access-key-property 存儲AWS access key的屬性名稱
secret-key-property 存儲AWS secret key的屬性名稱

代碼中讀取生成用戶憑證:

@Value("${cloud.aws.credentials.accessKey}") String accessKey;@Value("${cloud.aws.credentials.secretKey}") String secretKey;

每次讀取創建AWS用戶和訪問密鑰。

Database Secret后端
為利用Vault Database Secret引擎動態創建數據庫憑證需添加spring-cloud-vault-config-databases依賴:

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-vault-config-databases</artifactId><version>2.1.0.RELEASE</version></dependency> </dependencies>

增加如下配置啟用Database后端:

spring.cloud.vault:database:enabled: truerole: my-rolebackend: databaseusername-property: spring.datasource.usernamepassword-property: spring.datasource.password

參數:
role Database Secret引擎中的角色名稱
username-property 存儲數據庫用戶名的屬性名稱
password-property 存儲數據庫密碼的屬性名稱

用戶名密碼保存在spring.datasource.username和spring.datasource.password內,datasource中無需再配置。

AWS EC2認證
首先修改heroes-policy.hcl,如下:

path "secret/heroes-api" {capabilities = ["read"] } path "secret/data/heroes-api" {capabilities = ["create", "read", "update", "delete", "list"] } path "secret/data/application" {capabilities = ["create", "read", "update", "delete", "list"] } path "secret/application" {capabilities = ["read"] }

重新寫入policy:

$ vault policy write heroes heroes-policy.hcl

配置bootstrap.yml:

spring:application:name: heroes-apicloud:vault:application-name: heroes-apihost: vault.itrunner.orgport: 8200scheme: httpsauthentication: AWS_EC2connection-timeout: 5000read-timeout: 15000config:order: 10ssl:trust-store: classpath:keystore.jkstrust-store-password: changeitkv:enabled: truebackend: secretprofile-separator: /default-context: applicationapplication-name: heroes-apiaws-ec2:role: dev-roleaws-ec2-path: awsidentity-document: http://169.254.169.254/latest/dynamic/instance-identity/pkcs7nonce: 0bcf5e01-9c32-168e-49a0-5cb717e60a3f

參數說明:
authentication: AWS_EC2 啟用AWS_EC2認證
aws-ec2.aws-ec2-path Spring Cloud Vault默認路徑為aws-ec2,HashiCorp Vault默認路徑為aws,兩者要一致

AWS IAM認證
AWS IAM認證,Spring Vault在生成簽名的請求時需要使用aws-java-sdk-core, 增加依賴:

<dependency><groupId>com.amazonaws</groupId><artifactId>aws-java-sdk-core</artifactId><version>1.11.513</version> </dependency>

下面我們來看一下生成簽名請求的過程。
Spring Vault org.springframework.vault.authentication.AwsIamAuthentication部分源代碼

protected static Map<String, String> createRequestBody(AwsIamAuthenticationOptions options) {Map<String, String> login = new HashMap<>();login.put("iam_http_request_method", "POST");login.put("iam_request_url", Base64Utils.encodeToString(options.getEndpointUri().toString().getBytes()));login.put("iam_request_body", REQUEST_BODY_BASE64_ENCODED);String headerJson = getSignedHeaders(options);login.put("iam_request_headers", Base64Utils.encodeToString(headerJson.getBytes()));if (!StringUtils.isEmpty(options.getRole())) {login.put("role", options.getRole());}return login; }...private static String getSignedHeaders(AwsIamAuthenticationOptions options) {Map<String, String> headers = createIamRequestHeaders(options);AWS4Signer signer = new AWS4Signer();DefaultRequest<String> request = new DefaultRequest<>("sts");request.setContent(new ByteArrayInputStream(REQUEST_BODY.getBytes()));request.setHeaders(headers);request.setHttpMethod(HttpMethodName.POST);request.setEndpoint(options.getEndpointUri());signer.setServiceName(request.getServiceName());signer.sign(request, options.getCredentialsProvider().getCredentials());Map<String, Object> map = new LinkedHashMap<>();for (Entry<String, String> entry : request.getHeaders().entrySet()) {map.put(entry.getKey(), Collections.singletonList(entry.getValue()));}try {return OBJECT_MAPPER.writeValueAsString(map);}catch (JsonProcessingException e) {throw new IllegalStateException("Cannot serialize headers to JSON", e);} }

在org.springframework.vault.authentication.AwsIamAuthenticationOptions .AwsIamAuthenticationOptionsBuilder中硬編碼了sts URI為“sts.amazonaws.com”,因此不能從地址推斷出region(推斷方法請看com.amazonaws.util.AwsHostNameUtils.parseStandardRegionName()):

private URI endpointUri = URI.create("https://sts.amazonaws.com/");

繼續閱讀com.amazonaws.auth.AWS4Signer源碼,看如何生成簽名:
com.amazonaws.auth.AWS4Signer部分源碼

public void sign(SignableRequest<?> request, AWSCredentials credentials) {// anonymous credentials, don't signif (isAnonymous(credentials)) {return;}AWSCredentials sanitizedCredentials = sanitizeCredentials(credentials);if (sanitizedCredentials instanceof AWSSessionCredentials) {addSessionCredentials(request, (AWSSessionCredentials) sanitizedCredentials);}final AWS4SignerRequestParams signerParams = new AWS4SignerRequestParams(request, overriddenDate, regionName, serviceName,AWS4_SIGNING_ALGORITHM, endpointPrefix);addHostHeader(request);request.addHeader(X_AMZ_DATE, signerParams.getFormattedSigningDateTime());String contentSha256 = calculateContentHash(request);if ("required".equals(request.getHeaders().get(X_AMZ_CONTENT_SHA256))) {request.addHeader(X_AMZ_CONTENT_SHA256, contentSha256);}final String canonicalRequest = createCanonicalRequest(request, contentSha256);final String stringToSign = createStringToSign(canonicalRequest, signerParams);final byte[] signingKey = deriveSigningKey(sanitizedCredentials, signerParams);final byte[] signature = computeSignature(stringToSign, signingKey, signerParams);request.addHeader(AUTHORIZATION, buildAuthorizationHeader(request, signature, sanitizedCredentials, signerParams));proce***equestPayload(request, signature, signingKey, signerParams); }

在生成的簽名請求中必須包含region參數,如未增加配置,最終得到的region將是"us-east-1"。有興趣的同學可以繼續跟蹤源碼com.amazonaws.util.AwsHostNameUtils.parseRegion() -> parseRegionNameByInternalConfig() -> InternalConfig.Factory.getInternalConfig() -> InternalConfig load(),其中會讀取自定義配置文件"awssdk_config_override.json"。下面我們使用這個文件來定義region(放在resources目錄即可,如有更好方法請留言),內容如下:
配置Region

{"hostRegexToRegionMappings" : [ {"hostNameRegex" : "(.+\\.)?sts\\.amazonaws\\.com","regionName" : "cn-north-1"}] }

配置bootstrap.yml

spring.cloud.vault:authentication: AWS_IAMaws-iam:role: dev-role-iam-useraws-path: awsserver-name: vault.itrunner.org

參考文檔

HashiCorp Vault Learn about secrets management and data protection with HashiCorp Vault Vault Documentation GitHub - HashiCorp Vault Spring Cloud Vault spring-cloud-vault-config-samples AWS Instance Metadata and User Data AWS SDK for Go Developer Guide

總結

以上是生活随笔為你收集整理的Spring Boot加密配置属性--Spring Cloud Vault详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产在线精品国自产拍影院 | 国产破处在线播放 | 国产专区在线视频 | 日韩一区二区免费在线观看 | 在线观看免费高清视频大全追剧 | 麻豆视频在线播放 | 久久国产片 | 91亚洲精品久久久蜜桃 | 操操操av | 国产精品久久久久久久久久不蜜月 | 精品久久久免费视频 | 国产91探花 | 日韩三级不卡 | 日日干,天天干 | 中文字幕成人一区 | 久久亚洲综合国产精品99麻豆的功能介绍 | 狠狠操导航 | av高清在线观看 | 在线看日韩 | 国产精品自产拍在线观看中文 | 国产精品99久久久久久有的能看 | 在线看一区 | 绯色av一区 | 深夜免费福利网站 | 九九精品视频在线看 | aav在线| 激情欧美xxxx| 日韩av成人 | 久操97| 日日夜夜天天久久 | 国产一区二区三区高清播放 | 香蕉久草在线 | 麻豆精品国产传媒 | 国产在线观看免费 | 91麻豆精品国产91 | 青青草视频精品 | 亚洲自拍av在线 | 在线观看自拍 | 国产精品成人av电影 | 成人在线免费av | 在线天堂亚洲 | 最近2019中文免费高清视频观看www99 | 乱男乱女www7788 | 久久一区国产 | 亚洲成人国产 | 中文字幕一区二区三区乱码在线 | 国产丝袜一区二区三区 | 久久视频在线观看中文字幕 | 免费黄色小网站 | 国产精品18久久久 | 久久久精华网 | 欧美日韩精品在线观看 | 久久久久日本精品一区二区三区 | 在线免费av播放 | av大片网站 | 伊人五月婷 | 99久热在线精品视频成人一区 | 91av在线免费视频 | 国产成人精品一区在线 | 日韩精品短视频 | 欧美在线观看禁18 | 国色综合 | 天天射天天操天天 | 97超碰国产在线 | 99视频+国产日韩欧美 | 欧美va天堂va视频va在线 | 国产成人亚洲在线观看 | 久久1区 | 丁香五月亚洲综合在线 | 国产打女人屁股调教97 | 久久久精品欧美一区二区免费 | 伊人超碰在线 | 国产中文字幕网 | 国产资源精品 | 一区二区丝袜 | 欧美黄色免费 | 精品久久久久久国产91 | 波多野结衣一区三区 | 91丨九色丨高潮丰满 | 日本电影黄色 | 91福利社在线观看 | 成人一级黄色片 | 国产精品美女 | 九九99靖品 | 日韩在线观看一区二区 | 91成人小视频 | 国产在线2020| 午夜精品电影 | 国产高清久久久 | 精品免费在线视频 | 欧美专区亚洲专区 | 免费福利在线观看 | www.神马久久| 国产亚洲在线观看 | 97网在线观看 | 国产免费观看久久 | 曰韩精品 | 中文在线a√在线 | 粉嫩av一区二区三区四区 | 黄色www免费 | 九九在线高清精品视频 | 天天干天天搞天天射 | 亚洲视频第一页 | 激情狠狠干 | 天天亚洲 | 精品在线观 | 九九色在线观看 | 91免费观看网站 | 视频在线精品 | 夜夜澡人模人人添人人看 | 天天干 夜夜操 | 国产色就色 | 四虎影视成人永久免费观看视频 | 999久久久久久久久6666 | 国产在线中文字幕 | 九九热在线观看视频 | 中文字幕文字幕一区二区 | 91资源在线播放 | 免费黄av| 蜜臀久久99精品久久久无需会员 | 看片网站黄 | 国产高清绿奴videos | 成人动漫精品一区二区 | 久久99国产综合精品免费 | 日韩特黄av | 婷婷激情综合 | www.com操| 美女网站视频久久 | 欧美日韩视频在线观看一区二区 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 毛片网站在线看 | 一区二区三区四区五区六区 | 国内成人av | 天天操天天怕 | 99精品一区 | 日本三级久久久 | 黄色成年片 | 五月天色婷婷丁香 | 黄色成人影视 | 奇米影音四色 | 久久精品之 | 17婷婷久久www| 五月婷香蕉久色在线看 | 91精品国产欧美一区二区 | 亚洲欧洲xxxx| 欧美黑人巨大xxxxx | 91麻豆精品国产91久久久更新时间 | 国产精品久久二区 | 蜜臀av夜夜澡人人爽人人桃色 | 狠狠色噜噜狠狠 | 亚洲精品网站在线 | 五月天激情婷婷 | 国产高清av在线播放 | 四虎影视精品成人 | 日本护士三级少妇三级999 | 日本一区二区不卡高清 | 久久神马影院 | 精品国产乱码一区二 | 国产精品视频在线观看 | 欧美一级视频免费看 | 欧美日韩国产一区二区三区在线观看 | 国产99在线 | 久久人人爽av | 日韩欧美高清视频在线观看 | 91看片淫黄大片一级在线观看 | 欧美成人日韩 | 国产精品久久久久国产精品日日 | 午夜少妇av| 国产午夜精品在线 | 在线免费视频 你懂得 | 成年人免费观看在线视频 | 国产在线精品视频 | 一二三区视频在线 | 国产精品porn | 操操操天天操 | 激情视频二区 | 久久一二区| 欧美一二三视频 | 区一区二在线 | 激情欧美一区二区免费视频 | 欧美一区二区精品在线 | 制服丝袜欧美 | 久久久久久久久福利 | 国产96精品 | 欧洲亚洲精品 | www.91av在线| 色久天| 免费人成在线观看网站 | 在线欧美小视频 | 成人羞羞视频在线观看免费 | 97电影院网 | 91在线精品秘密一区二区 | 久久香蕉一区 | 一区二区三区在线视频观看58 | 亚洲va天堂va欧美ⅴa在线 | 日韩欧美视频一区二区三区 | www.五月婷| 99久久精品久久亚洲精品 | 麻豆成人在线观看 | 超碰日韩在线 | 久久精品影片 | 国产精品成人一区二区三区吃奶 | 国产伦理久久精品久久久久_ | 韩国视频一区二区三区 | 国产精品久久久久9999吃药 | 一区二区三区 亚洲 | 亚洲精品日韩一区二区电影 | 欧美成人亚洲 | 最新国产在线观看 | 国产一区免费 | 97超碰免费 | 亚洲综合成人在线 | 有码中文字幕在线观看 | 日本激情视频中文字幕 | 中文字幕在线播放一区 | av电影免费观看 | 免费观看的黄色片 | 在线观看黄色 | 亚洲一区精品人人爽人人躁 | 久久久免费国产 | 国产精品久久久久久高潮 | 欧美一级视频一区 | 国产亚洲成人网 | 天天干天天操天天拍 | 精品9999 | 免费三级影片 | 国产男女爽爽爽免费视频 | 国产97色在线 | 日韩精品一区二区三区水蜜桃 | 婷婷丁香自拍 | 在线免费视频a | 九九色综合 | 日韩网站免费观看 | 亚洲毛片在线观看. | www.夜夜操.com| 久久99深爱久久99精品 | 国产精品久久久 | 免费福利视频网站 | 欧美高清视频不卡网 | 国产色一区 | 韩国精品视频在线观看 | 在线a亚洲视频播放在线观看 | 天天色天天搞 | 69av国产| 久草久热 | 最新午夜电影 | 久草在线观看资源 | 国产亚洲精品女人久久久久久 | 国产中文字幕在线 | 婷婷丁香色 | 97色涩| 国产不卡在线播放 | 色中色综合| 激情欧美xxxx | 久久精品看片 | 中文字幕最新精品 | 久久中文字幕在线视频 | 美女视频永久黄网站免费观看国产 | 亚洲免费a | 久久免费国产电影 | 天天草天天干天天射 | 深爱激情婷婷网 | 国产免费午夜 | 丁香花在线视频观看免费 | 婷婷开心久久网 | 亚洲一片黄 | 国产精品日韩精品 | 精品美女在线视频 | 日日干干| 亚洲精品乱码久久久久久写真 | 国产91欧美 | 国语自产偷拍精品视频偷 | 免费观看性生活大片3 | 午夜精品av在线 | 九九九九热精品免费视频点播观看 | 中文字幕精品三区 | 久久国产精品第一页 | 99视频在线看 | 天天干,天天射,天天操,天天摸 | 天天草天天色 | 亚洲国产欧美在线人成大黄瓜 | 97国产人人| 日韩高清黄色 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 国产精品日韩精品 | 亚洲一区日韩在线 | 黄色网在线播放 | 91免费观看国产 | 免费成人在线电影 | 免费亚洲一区二区 | 射久久久| 欧美亚洲成人免费 | 亚洲国产精品视频在线观看 | 亚洲人人爱 | 亚洲精品成人av在线 | 日韩91精品 | 久久国产精品久久w女人spa | 亚洲91精品 | 久久福利 | 国产又粗又猛又爽又黄的视频先 | 亚洲黄色一级大片 | 亚洲专区免费观看 | 黄av免费在线观看 | 亚洲一区二区天堂 | 91人人揉日日捏人人看 | 国产精品一区二区三区电影 | 国产a级片免费观看 | 麻豆视频免费在线观看 | 在线电影 一区 | 国产精品国产三级在线专区 | 欧美成人69av | 中文在线天堂资源 | 中文字幕激情 | 黄色一级影院 | 亚洲精品午夜久久久久久久久久久 | 一本一道久久a久久综合蜜桃 | 中文字幕日韩高清 | 中文字幕av免费观看 | 五月婷婷av在线 | 伊人色综合久久天天 | 日韩免费av片 | 黄av在线| 日韩精品视 | 黄色一集片 | 免费视频久久 | 2023亚洲精品国偷拍自产在线 | 黄色大片av | 久久精品视频在线 | 精品国产一二三四区 | 夜夜骑日日 | 97av免费视频 | 在线性视频日韩欧美 | 麻豆传媒视频观看 | 9999精品视频 | 黄色99视频 | 一级一片免费看 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 亚洲国产高清视频 | 成人黄色片免费看 | 免费在线黄网 | 99视频在线免费观看 | 国产精品毛片一区二区三区 | 久草精品视频在线看网站免费 | 日韩欧美一区二区三区黑寡妇 | 亚洲精品视频免费在线观看 | 国产网站av | av在线之家电影网站 | 欧美日韩一区二区在线 | 亚洲欧美一区二区三区孕妇写真 | www.色综合.com | 国产成人在线一区 | 成年人免费在线观看 | 久久亚洲欧美 | 国产在线精品国自产拍影院 | 欧美午夜视频在线 | 久久www免费人成看片高清 | 日韩中文字幕在线不卡 | 日本不卡一区二区 | ,午夜性刺激免费看视频 | 中国一级片免费看 | 91免费网址 | 亚洲在线视频播放 | 国产精品免费视频观看 | 超碰免费成人 | 色婷婷亚洲综合 | av中文字幕在线免费观看 | 国内精品久久天天躁人人爽 | 久久97超碰 | 成年人电影毛片 | 麻花豆传媒mv在线观看 | 中文字幕一区二区三区乱码在线 | 天天色天天操天天爽 | 免费污片| 精品美女在线视频 | 美女视频黄,久久 | 91视频亚洲 | 日日夜夜亚洲 | 人人爽人人插 | 日本精品va在线观看 | www.夜夜骑.com| 天天曰天天曰 | 久久尤物电影视频在线观看 | 亚洲精品国偷自产在线91正片 | 欧美精品久久久久久久久久丰满 | 黄色大片免费播放 | 日韩精品视频免费专区在线播放 | 国产精品久久久久久久av电影 | 成人av午夜| 亚洲aⅴ一区二区三区 | 中文字幕在线视频网站 | 成人av在线资源 | 玖操 | 久久精品视频中文字幕 | 免费在线中文字幕 | 日韩中文字幕免费视频 | 在线观看一区二区精品 | 精品96久久久久久中文字幕无 | 在线草 | 91九色porny蝌蚪视频 | 日韩中文字 | 超碰在线94 | 精品一区二区三区四区在线 | 色网站在线免费 | 黄av资源 | 亚洲成人在线免费 | 免费情缘 | 日韩电影在线观看中文字幕 | 99这里只有精品视频 | 最新av在线播放 | 欧美另类一二三四区 | 欧美日韩啪啪 | 国产精品久久久久久久久久久久 | 69av在线视频 | 中文字幕 第二区 | 色综合久久久久久久久五月 | 欧美婷婷综合 | 在线激情影院一区 | 99热超碰在线 | 日日夜夜艹| 日日夜夜中文字幕 | 久久免费99精品久久久久久 | 久久久久久久久久福利 | 成人永久免费 | 久久综合久色欧美综合狠狠 | 337p日本大胆噜噜噜噜 | 久久久国产网站 | 久草在线综合网 | 国产日韩欧美视频在线观看 | 友田真希x88av | 免费视频二区 | 免费观看成年人视频 | 久久99久久99精品免视看婷婷 | 美女视频又黄又免费 | 中文字幕成人av | avhd高清在线谜片 | 91香蕉视频在线下载 | 婷婷成人综合 | 欧美日韩午夜 | 久草网在线观看 | 精品中文字幕在线观看 | 在线之家免费在线观看电影 | 国产高清视频在线观看 | 精品欧美小视频在线观看 | 18岁免费看片 | 亚洲激情五月 | 日韩中文字幕第一页 | 国产日产av | 久久影视精品 | 波多野结衣精品 | 免费a v在线 | 奇米导航 | 在线网站黄 | 亚洲欧洲国产视频 | 夜添久久精品亚洲国产精品 | 97精产国品一二三产区在线 | 91传媒在线播放 | 国产在线999 | 国内精品久久久久影院一蜜桃 | 久久成人麻豆午夜电影 | 久久草在线免费 | 久久视频在线视频 | 免费观看www小视频的软件 | 亚洲天堂网在线观看视频 | 免费国产黄线在线观看视频 | 婷婷亚洲五月 | 9热精品 | 久久精品视频免费观看 | 国产高清视频在线播放一区 | 欧美精品生活片 | 欧美一级欧美一级 | 奇米影视8888 | 国产裸体视频网站 | 最新不卡av | 中文字幕一区二区三 | 黄色成人免费电影 | 欧美日韩高清在线 | 色婷五月天| 久久久久久免费网 | 91精品系列 | 人人干在线观看 | 久久久久久久18 | 狠狠干婷婷 | 国产黑丝一区二区三区 | 99热国产精品 | 国产一区二区在线播放视频 | 国产高清一区二区 | 97香蕉超级碰碰久久免费软件 | 久草在在线视频 | 日本在线观看中文字幕无线观看 | 亚洲成a人片77777kkkk1在线观看 | 色综合久久88色综合天天人守婷 | 91麻豆精品国产午夜天堂 | 日韩二区三区在线 | 久久久久久久国产精品视频 | 国产成人精品一区二区三区 | 久久精品视频一 | 菠萝菠萝蜜在线播放 | 国产视频网站在线观看 | 九九精品毛片 | 天天爱综合 | av在线看片 | 91爱在线| 成人黄色av免费在线观看 | 欧美在线aa | 黄色小说视频在线 | av免费看在线 | 亚洲精品tv久久久久久久久久 | 精品久久久久久国产偷窥 | 色天天久久 | 深爱激情亚洲 | 韩国视频一区二区三区 | 在线日韩视频 | 91精品夜夜 | 国产91精品看黄网站 | 国产精品成人国产乱一区 | 91精品国产综合久久久久久久 | 色爱区综合激月婷婷 | 成人免费看片98欧美 | 午夜免费电影院 | 久久99国产精品自在自在app | 五月开心网 | 国产99免费视频 | 天天操综合网站 | 日韩字幕在线观看 | 日韩一区二区三区免费视频 | 久草线| 日韩在线色 | 热热热热热色 | 国产剧情久久 | 97在线免费视频 | 日韩婷婷| 天天操天天玩 | www.久久久.com | 97超碰人 | 99精品在线视频观看 | 亚洲精品乱码久久久久久 | 成人蜜桃网 | 九九九热精品免费视频观看网站 | 免费网站v | 在线探花 | 中文字幕日韩在线播放 | 色哟哟国产精品 | 手机看片1042 | 色狠狠一区二区 | 日韩精品一区二区在线视频 | 992tv在线观看网站 | 天天射一射 | 91亚洲视频在线观看 | 国产精品永久免费观看 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 亚洲精品动漫久久久久 | 亚洲区视频在线观看 | 日韩色高清 | 国产精品久久久久久五月尺 | 深夜免费福利网站 | 亚洲自拍偷拍色图 | 人成在线免费视频 | 成人黄色av免费在线观看 | 欧美一级视频免费 | 激情图片久久 | 国产中文字幕大全 | 久久久免费国产 | 国产精品成人av在线 | 99成人精品 | www久久99 | 久久国产手机看片 | 久久人网| 国产精品一区久久久久 | 日韩大陆欧美高清视频区 | 丁香5月婷婷久久 | 久草视频在线播放 | 国产精品999久久久 久产久精国产品 | 九九久久久久99精品 | 日韩在线观看一区二区三区 | 久久久麻豆精品一区二区 | 欧美日韩aaaa | www免费 | 在线影院中文字幕 | 中文字幕在线日本 | 欧美日韩国产免费视频 | 99这里精品 | 99精品在线视频播放 | 黄色在线看网站 | 伊人资源站| 国产精品theporn | 日韩手机视频 | 色五月成人 | 9999免费视频| 国产高清综合 | 激情综合久久 | 成人免费色 | 91亚·色 | 国产 欧美 日产久久 | 欧美精品乱码久久久久久按摩 | 国产精品永久免费视频 | 国产色视频一区二区三区qq号 | 黄色av在| 日批视频 | 最新午夜电影 | 久久久久观看 | 99久久www免费 | 久久综合久久综合这里只有精品 | 色综合久久久久综合99 | 深爱激情久久 | 国产精品1区2区 | 国产高清专区 | 亚洲国产69| 午夜精品一二区 | 最近免费中文字幕大全高清10 | 天天射天天操天天 | 免费观看成年人视频 | 在线免费成人 | 久久久久国产精品免费免费搜索 | 国产激情电影综合在线看 | 在线观看中文字幕亚洲 | 久 久久影院 | 精品久久久久久亚洲 | 国产一级高清 | 国产不卡片 | 亚洲精品乱码久久 | 日韩在线免费视频观看 | 综合天天| 国产精品一区在线观看你懂的 | 在线观看免费色 | 四虎影视精品成人 | 在线激情电影 | 色天天综合网 | 91在线看网站 | 91精品推荐| 操操综合 | 午夜精品剧场 | 激情五月看片 | 国产亚洲精品久久久久久移动网络 | 不卡av在线免费观看 | 在线看国产精品 | 久久精品1区 | 久久免费国产精品1 | 91精品视频免费看 | 久久人网 | 99热精品免费观看 | 久久免费看 | 久草视频在线免费播放 | 五月婷婷亚洲 | 亚洲黄色在线观看 | 色婷婷久久久 | 欧美 日韩 国产 成人 在线 | 人人爽人人爽人人爽 | 欧美91精品| 欧美综合在线视频 | 国产成人精品一区二三区 | 国产视频日韩视频欧美视频 | 亚洲精品va| 日本中文字幕网站 | 973理论片235影院9 | 女人18毛片a级毛片一区二区 | 在线之家官网 | 97视频在线观看成人 | 91福利视频网站 | 麻豆国产网站入口 | 欧美韩国在线 | 五月婷婷.com | 久久艹艹| 婷婷中文字幕在线观看 | 日韩大片在线 | 福利电影久久 | a久久免费视频 | 99热这里只有精品在线观看 | 狠狠搞,com | 超碰在线97国产 | 国产精品一区一区三区 | 亚洲欧美少妇 | 久久午夜电影网 | 99精品视频精品精品视频 | 一二区av| 中文在线8资源库 | 国产精品 国内视频 | 国内精品久久久久久久久 | 日韩精品免费一区二区三区 | 国产精品美女久久久网av | 日韩在线电影一区 | 久久 国产一区 | 欧美aaa一级| 国产.精品.日韩.另类.中文.在线.播放 | 国产色视频123区 | 久久激情视频免费观看 | 在线亚洲人成电影网站色www | 国产字幕av | 成人av一区二区在线观看 | 玖玖精品视频 | 久草精品视频在线播放 | 国产精品久99 | zzijzzij日本成熟少妇 | 911香蕉视频| 911精品美国片911久久久 | 91免费在线视频 | 女人高潮特级毛片 | 免费观看版 | 久久1电影院 | 久久综合中文字幕 | 蜜臀av网址| 国产欧美久久久精品影院 | 欧美日韩观看 | 久久精品国产一区二区 | 欧美天堂视频在线 | 九九九热 | 色噜噜在线观看视频 | 久久婷婷视频 | 不卡的av在线 | 天天干天天摸 | 久久免费在线观看 | 亚洲综合成人婷婷小说 | 久久99精品波多结衣一区 | 99视频偷窥在线精品国自产拍 | 中文字幕在线观看免费高清完整版 | 久久婷婷视频 | 久草在线欧美 | 碰超在线 | 在线看片91 | 丁香六月婷 | 一级a性色生活片久久毛片波多野 | 日韩高清激情 | 99视频久久 | 国产精品一区二区三区在线 | 国产成人av综合色 | 99久久激情| 国产精品国产毛片 | 国产极品尤物在线 | 国产高清av免费在线观看 | 99视频国产精品免费观看 | 久久久精品国产一区二区 | 欧美日在线 | av在线专区 | 国产精品久久久影视 | 99视频精品全部免费 在线 | 国产精品久久久久四虎 | 在线小视频 | 在线观看av大片 | 国产96在线 | 国产精品一区二区无线 | 欧美一级片免费在线观看 | 亚洲另类视频在线 | 福利视频精品 | 国产精品久久久777 成人手机在线视频 | 国产精品久久99综合免费观看尤物 | 中文在线字幕免费观看 | 最近日本韩国中文字幕 | 人人爽久久久噜噜噜电影 | 丁香高清视频在线看看 | 日韩精品一区二区三区水蜜桃 | 久久国产91| 国产精品三级视频 | 九色最新网址 | 天天干夜夜操视频 | 国产精品久久久久久久久久尿 | 欧洲精品亚洲精品 | 日韩欧美xxxx | 久久久国产精品成人免费 | 久久久久综合视频 | 丁香狠狠 | 亚洲国产久 | 亚洲精品一区二区三区在线观看 | 国产黄色视| 久久精品高清视频 | 91精品国产乱码久久桃 | 99视频在线观看视频 | 午夜精品久久久久久99热明星 | a级国产乱理伦片在线观看 亚洲3级 | 国产精品网在线观看 | 久久久免费毛片 | 国产色中涩| 久av在线 | 四虎影视国产精品免费久久 | 999久久久精品视频 日韩高清www | 一区二区三区精品在线 | 国产高清不卡 | 黄色免费观看视频 | 一区二区视频电影在线观看 | 一区二区三区日韩视频在线观看 | 久久久久久久久久影院 | 成人黄色av网站 | 天天色天天操天天爽 | 亚洲精品www久久久 www国产精品com | 婷婷夜夜 | 五月婷婷丁香网 | 日本精品视频网站 | 国产精品伦一区二区三区视频 | 深爱综合网 | 久久艹欧美 | 久久国产手机看片 | 成年免费在线视频 | 91精品导航 | 91黄色视屏| 伊人五月综合 | 涩涩网站在线观看 | 国产一级电影网 | 中文字幕欧美日韩va免费视频 | 久久国产视屏 | 黄色小说免费观看 | 国产黄色片免费观看 | 色免费在线 | 涩涩网站在线看 | 色插综合| 国产精品久久久久永久免费观看 | 午夜成人免费影院 | 久久久 激情 | 二区三区在线视频 | 国产字幕在线播放 | 国产精品女人久久久久久 | 日韩性久久 | 欧美日韩视频一区二区 | 国产精品免费人成网站 | 激情综合五月 | 国产一级视频在线 | 国产精品视频全国免费观看 | 亚洲污视频 | 色av色av色av | 又黄又爽又无遮挡的视频 | 在线免费观看国产精品 | 亚洲黑丝少妇 | 国产精久久久久久妇女av | 亚洲精品tv | 欧美日韩中文在线 | 91九色丨porny丨丰满6 | 国产亚洲91 | 国产福利精品视频 | 久久人人做 | 日韩中字在线观看 | 欧美天堂视频在线 | 日本性生活免费看 | 国产中文视 | 成人观看 | 国产亚洲一级高清 | 日韩在线国产精品 | 欧美va天堂va视频va在线 | 精品国产资源 | 国产精品一区二区三区视频免费 | 久久只精品99品免费久23小说 | 五月天天av| 在线天堂中文www视软件 | 精品国产乱码久久久久久天美 | www色综合| 女人18毛片a级毛片一区二区 | 黄网站app在线观看免费视频 | 麻豆视频免费看 | 亚洲精品午夜一区人人爽 | 欧洲一区二区三区精品 | 国产福利91精品一区 | 久久99热这里只有精品 | 亚洲精品国 | 日韩在线播放欧美字幕 | 九九精品视频在线观看 | 香蕉视频免费在线播放 | 久久久久久久久久久高潮一区二区 | 91色综合| 天天做天天爱天天爽综合网 | 亚洲精品久久视频 | 91麻豆精品国产91久久久无限制版 | 69视频国产 | 国产精品乱码久久 | 懂色av懂色av粉嫩av分享吧 | 国产色婷婷精品综合在线手机播放 | 手机在线黄色网址 | 日日爱av | 日韩av一区二区在线播放 | 国产精品久久久久久久久久久久午夜片 | 最近中文字幕视频网 | 丰满少妇在线观看 | 国产精品成人免费一区久久羞羞 | 国产精品一级视频 | 成人av在线网址 | 亚洲精品免费播放 | 美女视频a美女大全免费下载蜜臀 | 亚洲综合欧美精品电影 | 欧美在线日韩在线 | 果冻av在线 | 中文字幕第一页在线播放 | 日本黄色大片免费看 | 亚洲精品网站在线 | 色天天综合久久久久综合片 | 豆豆色资源网xfplay | 国产精品免费视频一区二区 | 97色资源 | 国产69精品久久久久久 | 欧美视频xxx| 99久久国产免费看 | 免费看v片网站 | 日韩免费区| 91麻豆精品国产自产在线游戏 | 久草干| 久久亚洲综合国产精品99麻豆的功能介绍 | avwww在线| 色婷婷导航 | 91九色网站| 国产黑丝一区二区 | 色噜噜在线观看 | 久久99国产精品免费网站 | 综合久久久久 | 精品久久久99 | 日韩av电影网站在线观看 | www.黄色片.com| 麻豆视频免费播放 | 五月婷婷丁香 | 国产91精品一区二区麻豆网站 | 天天操狠狠操网站 | 天天操天天操天天操天天操 | 久久久久久久免费 | 国内精品久久久久国产 | 国产一级片免费观看 | 国产黄色a | 国产99精品在线观看 | 粉嫩高清一区二区三区 | 久久艹久久 | 精品福利av | 欧美与欧洲交xxxx免费观看 | 亚洲a色 | 人人添人人澡人人澡人人人爽 | 成人久久精品 | 国产一级片一区二区三区 | 一区二区三区在线看 | 又黄又爽又色无遮挡免费 | 久久精品国产亚洲a | 网址你懂的在线观看 | 中文字幕av一区二区三区四区 | www.国产毛片 | 日韩高清无线码2023 | 亚洲精品国产区 | 狠狠色丁香久久婷婷综 | 少妇搡bbbb搡bbb搡aa | 欧美精品被 | 青青河边草免费视频 | 婷婷六月在线 | 99热超碰 | 九九九热视频 | 国产精品成人在线 | 国产又粗又猛又爽 | 成年人电影免费在线观看 | 久久99久久99精品免视看婷婷 | 中文有码在线 | 欧美一级欧美一级 | 久草在线视频在线 | 在线天堂v | 久久国产系列 | 狠狠色丁香婷婷 | av在线播放亚洲 | 亚洲久草在线视频 | 亚洲综合色丁香婷婷六月图片 | 超碰国产在线 | 国产在线免费av | 久久99久国产精品黄毛片入口 | 亚洲精选久久 | 婷婷丁香九月 | 在线免费高清一区二区三区 | 欧美日韩国产一区二 | 国产午夜小视频 | 久久精品精品 | 欧美精品天堂 | 国产日韩欧美在线免费观看 | 91精品国产乱码久久桃 | 黄色日本免费 | 九九九国产 | 伊人热| 一区二区在线影院 | 欧洲不卡av | 婷婷色综 | 久久夜靖品| 亚洲综合欧美激情 | 色综合天天干 | 亚洲色影爱久久精品 | www.看片网站 | 91手机在线看片 | 青青河边草观看完整版高清 | 成片视频免费观看 | 国产日韩欧美综合在线 | 国产一级片播放 | 国产福利精品视频 | 成人毛片a | 人人舔人人舔 | 蜜臀aⅴ国产精品久久久国产 | 99成人在线视频 | 国产精品美女www爽爽爽视频 | 在线视频精品 | 久久综合色播五月 | 亚洲每日更新 | www.五月婷| 国产成人精品福利 | 久久免费99精品久久久久久 | 久久免费看毛片 | 国产一区久久 | 91精品视频免费看 | 国产在线第三页 | 97看片网| 狠狠色狠狠色综合日日小说 | 国产视频一区在线免费观看 | 综合久久久久久 | 免费看成人片 | 国产精在线 | 国产又粗又硬又爽的视频 | 国产精品99久久久 |