日韩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在线日韩| 99精品视频网站 | 日韩精品一区二区三区水蜜桃 | 91精品推荐 | 丁香午夜 | 亚洲欧洲xxxx | 午夜精品一区二区三区免费视频 | 韩国av不卡 | 热re99久久精品国产66热 | 亚洲激情小视频 | 欧美国产日韩激情 | 性日韩欧美在线视频 | 黄色特级毛片 | 久久成人人人人精品欧 | 人人干干人人 | 黄色av一区二区三区 | 日韩区在线观看 | 亚洲精品美女久久久久 | 久久久成人精品 | 成人三级网址 | 最近日本字幕mv免费观看在线 | 欧日韩在线视频 | 最近能播放的中文字幕 | 国产在线探花 | 午夜精品99久久免费 | 国产久草在线观看 | 国产精品久久久久久一二三四五 | 亚洲精品视频在线免费 | 97av视频在线观看 | 国产伦理精品一区二区 | 日韩av不卡在线播放 | 在线观看中文字幕一区二区 | 久久视频| 色网站在线免费观看 | 人人超碰免费 | 国产亚洲片 | 999电影免费在线观看 | 992tv在线成人免费观看 | 黄a网站 | 日本激情视频中文字幕 | 亚洲国产精品第一区二区 | 91桃色免费视频 | 色婷婷骚婷婷 | 国产精品成人自产拍在线观看 | 超碰在线免费福利 | 久久精品国产精品亚洲精品 | 亚洲欧美成人综合 | 激情综合六月 | 午夜 久久 tv | 精品久久久久亚洲 | 九九热在线视频 | 日日天天狠狠 | 黄色免费大全 | 五月天激情在线 | av成人动漫| 色妞久久福利网 | 久久久夜色 | 久久福利在线 | 午夜国产福利在线 | 在线视频成人 | 中文欧美字幕免费 | 超碰999| 亚洲最快最全在线视频 | 国产在线色视频 | 午夜精品一区二区三区在线播放 | 成人av一区二区兰花在线播放 | 亚洲精品456在线播放乱码 | 婷婷视频在线观看 | 久久亚洲精品电影 | 国产精品男女啪啪 | 精品国产免费一区二区三区五区 | 久久免费视频网站 | 国产区 在线 | 日本超碰在线 | 96精品高清视频在线观看软件特色 | 精品国产一区二区三区久久久久久 | 日日久视频 | 日韩欧美精品在线观看视频 | 国产精品99久久久久 | 91亚州 | 国产精品正在播放 | 久草在线欧美 | 天天插日日插 | 国产专区精品视频 | 日韩美av在线 | 91新人在线观看 | 人人草在线观看 | 久草视频手机在线 | 亚洲视频第一页 | 三级小视频在线观看 | 91色蜜桃 | 久久亚洲免费 | 亚洲国产精品成人av | 久久久久久久久久久福利 | 在线观看一级 | 麻豆视频在线 | 国产精品丝袜久久久久久久不卡 | 欧美精品中文字幕亚洲专区 | 91成人天堂久久成人 | 欧美久久99 | 色www精品视频在线观看 | 五月的婷婷 | 亚洲天天在线 | 国产亚洲精品成人av久久影院 | 国产精品美女久久久久久久久久久 | 国产精品久久久免费 | 国产99久久久精品 | 四虎在线免费视频 | 在线国产不卡 | 91完整版| 9在线观看免费高清完整版在线观看明 | 婷婷5月激情5月 | 999久久久免费精品国产 | 国产成人精品午夜在线播放 | 欧美另类网站 | 天天综合网在线 | 亚洲va综合va国产va中文 | 亚洲一二视频 | 91亚洲精品在线观看 | 九九热中文字幕 | 婷婷福利影院 | 看片一区二区三区 | 国产一区视频在线观看免费 | 国产视频在线观看一区二区 | 国产精品一区二区62 | 国产99久久久精品 | 中文字幕资源网在线观看 | 91精品国产九九九久久久亚洲 | 日韩区欠美精品av视频 | 亚洲国产欧美在线人成大黄瓜 | 日韩av二区 | 免费看麻豆 | 天天天色综合 | 日韩理论片 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 国产精品一区久久久久 | 2019中文最近的2019中文在线 | 欧美专区日韩专区 | 国产亚洲精品无 | 国产成人精品亚洲精品 | 欧美另类亚洲 | 国产成人亚洲在线观看 | 亚洲精品乱码久久久久久高潮 | 久久高清毛片 | 成人黄色电影免费观看 | 毛片www | 日本中文字幕电影在线免费观看 | 69绿帽绿奴3pvideos | 免费黄色小网站 | 麻豆视频国产精品 | 激情欧美xxxx | 久久经典国产视频 | www.在线观看av | 黄色视屏免费在线观看 | 亚洲精品国产视频 | 97超视频免费观看 | 亚洲日韩欧美一区二区在线 | 色婷婷色 | 日产乱码一二三区别在线 | 在线a人片免费观看视频 | 婷婷久月 | 日韩aⅴ视频| 久草在线这里只有精品 | 色丁香色婷婷 | 日本中文乱码卡一卡二新区 | 日韩在线观看a | av电影在线免费观看 | 奇米网网址 | 日本中文字幕在线免费观看 | 国产美女在线免费观看 | 国产精品久久99精品毛片三a | 超碰人人干人人 | 欧美日韩中文国产一区发布 | 人人爱爱人人 | 欧美日韩在线视频一区二区 | 国产一区二区三区免费在线 | 国产精品大尺度 | 玖玖在线视频观看 | 三级在线国产 | 国产精品视频免费在线观看 | 一级精品视频在线观看宜春院 | 中文字幕黄色网址 | 久久毛片高清国产 | 国产亚洲成人精品 | 亚洲.www | 五月花激情| 亚洲欧美精品一区二区 | 欧美色图视频一区 | 午夜狠狠操| 福利视频导航网址 | 国产精品免费视频一区二区 | 久久综合在线 | 一区二区视 | 精品亚洲va在线va天堂资源站 | 亚洲国产精品成人va在线观看 | av电影不卡| 国外成人在线视频网站 | 国产一区在线视频观看 | 丁香六月av | 国产一区91 | 一级黄色免费 | 亚洲国产中文字幕在线观看 | 国产高清成人 | 日日日爽爽爽 | 国产视频久久 | 亚洲欧洲美洲av | 国产v在线播放 | 欧美小视频在线 | 99热最新在线 | 国产 日韩 在线 亚洲 字幕 中文 | 亚洲视频免费在线观看 | 亚洲精品66| 免费碰碰 | 天天射天天操天天色 | 操处女逼 | 亚洲 欧美 精品 | 色综合天天狠天天透天天伊人 | 国产黄色片一级三级 | 久久狠狠亚洲综合 | 在线视频观看你懂的 | 亚洲欧美日韩精品一区二区 | 亚洲综合成人婷婷小说 | 麻豆精品在线 | 国产你懂的在线 | 精品99免费视频 | 九九久久久久99精品 | 91精彩在线视频 | 五月天久久久久 | 99热在线看 | 国产精品美女久久久久久久 | 国产系列 在线观看 | 色婷婷福利视频 | 麻豆极品 | 成人免费视频视频在线观看 免费 | 午夜美女wwww | 色综合久久久 | 天天操天天干天天玩 | 久久99精品久久只有精品 | 久久久久亚洲精品成人网小说 | 欧洲一区二区三区精品 | 久精品在线观看 | 亚洲精品高清视频在线观看 | 一区二区 不卡 | 天天综合五月天 | 91系列在线观看 | 高清不卡一区二区三区 | 日韩剧 | 天天色天天操综合网 | 成人久久精品视频 | 国产午夜三级 | 最新中文字幕在线资源 | 免费看黄在线 | 欧美日韩国产伦理 | av中文字幕av | 九九免费视频 | 色久五月 | 啪啪肉肉污av国网站 | 亚洲精品国产成人 | 日韩最新av在线 | 成人va天堂| 久久精品老司机 | 四虎国产视频 | 日韩欧美国产精品 | 天天操夜夜操 | 91麻豆精品国产自产 | 日本中文字幕在线电影 | 欧美巨大荫蒂茸毛毛人妖 | 免费男女网站 | 天天爽夜夜爽精品视频婷婷 | 国产 视频 久久 | 国产免费av一区二区三区 | 韩国在线视频一区 | 国色天香在线 | 亚洲伦理中文字幕 | 婷婷色综合网 | 久久久久欠精品国产毛片国产毛生 | 婷婷久久网 | 国产日韩精品在线观看 | 婷婷午夜| 日韩网站免费观看 | 一区二区三区日韩视频在线观看 | 婷婷丁香视频 | 激情九九 | 超碰在线9 | 国产一级二级在线观看 | 99人成在线观看视频 | 欧美做受高潮 | 国产护士在线 | 久久久久久久久久福利 | 久久天堂亚洲 | 久久综合偷偷噜噜噜色 | 国产亚洲精品bv在线观看 | 国产亚洲精品久久久久久大师 | a在线观看免费视频 | 日韩中文在线电影 | 韩国一区二区在线观看 | 久久综合成人网 | 成人精品国产免费网站 | 波多野结衣理论片 | 国产成人精品日本亚洲999 | 色在线国产 | 日韩在线高清 | 欧美乱淫视频 | 亚洲人在线7777777精品 | 97超碰站 | 成人四虎| 国产一区二区视频在线 | 久久精品一区二区三区四区 | 97在线观 | 亚洲片在线观看 | 亚洲人在线7777777精品 | av电影在线播放 | 久久久久久久久毛片精品 | 久久九九网站 | 久久成人麻豆午夜电影 | 天天操天天射天天舔 | 高清精品视频 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 精品中文字幕在线播放 | 3d黄动漫免费看 | 亚洲精品动漫成人3d无尽在线 | 国产精品成人aaaaa网站 | 蜜桃av人人夜夜澡人人爽 | 一区在线免费观看 | 亚州免费视频 | av网站在线免费观看 | 天天操天天摸天天干 | 亚洲干视频在线观看 | 久久精品观看 | 六月丁香婷 | www.亚洲激情.com | 久草免费资源 | 天天干天天综合 | 97视频免费看 | 久久激情五月婷婷 | 日韩中文字幕91 | 欧美a级在线免费观看 | 97在线视 | 亚洲精品午夜久久久久久久 | 夜色.com| 日韩av一区在线观看 | 97超碰人人在线 | 免费视频 你懂的 | 国产午夜精品在线 | 国产91对白在线 | 精品久久久一区二区 | 一区二区网 | av免费黄色 | 韩国av一区二区三区在线观看 | 中文字幕在线成人 | 激情中文字幕 | 欧美视频18 | 久久成人一区二区 | 91av蜜桃 | 免费成人短视频 | 婷婷六月丁| 日韩黄色一级电影 | 久久国产精品视频免费看 | 天天插天天爽 | 91九色国产 | 日本公妇在线观看 | 亚洲jizzjizz日本少妇 | 亚洲午夜精品久久久久久久久久久久 | 天天操天天干天天干 | 中文在线√天堂 | 91传媒在线看 | 91人人爱| 九色91av| 国产日韩在线一区 | 国产精品久久三 | 久久专区 | 亚洲最大av网站 | 一区二区三区在线免费播放 | 人人爽爽人人 | 婷婷色中文 | 91精品国产自产在线观看永久 | 日韩中文字幕亚洲一区二区va在线 | 色综合小说 | 精品国产一区二区三区不卡 | 亚洲国产精品久久久久久 | 激情自拍av | 综合中文字幕 | 国产色爽 | 欧美a级片免费看 | 国产精品久久久久久久久久久久午夜片 | 成人午夜精品久久久久久久3d | 国产色在线,com | 成人午夜电影在线播放 | 国产激情久久久 | 精品视频在线观看 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 亚洲黄色激情小说 | 久久精品中文字幕 | 久久不卡免费视频 | 99国产在线视频 | bbw av | 999精品网| 精品国产乱码久久久久久久 | 国产精品久久电影观看 | 欧美日韩3p | 91精品国产网站 | 国产高h视频 | 国产成人久久精品 | 日本字幕网| 午夜精品久久一牛影视 | 久草在线视频网站 | 日韩一区正在播放 | 亚洲精品视频网站在线观看 | 久久国产免费看 | 久久伊人精品天天 | 免费男女羞羞的视频网站中文字幕 | www最近高清中文国语在线观看 | 免费精品国产 | 久草在线视频看看 | www.婷婷com | www.久久99| 久久久穴 | 日韩影视在线 | 亚洲无线视频 | 国产 日韩 在线 亚洲 字幕 中文 | 全黄色一级片 | 久久免费精品国产 | 狠狠狠色丁香婷婷综合激情 | 欧洲av在线 | 国产成人精品久久久久 | 操操操综合 | 狠狠干综合 | 国产免费三级在线观看 | 国产一级二级三级视频 | 国产在线观看国语版免费 | 天天天操操操 | 国产精品免费在线播放 | 亚洲理论在线观看电影 | 97视频免费观看2区 亚洲视屏 | 久久 亚洲视频 | 99热999 | 亚洲久久视频 | 国产精品11 | 国产一区二区日本 | 国产伦理久久精品久久久久_ | 精品一区二区三区久久 | 欧美日韩综合在线观看 | 午夜在线资源 | 亚洲人成人99网站 | 天天操比| 婷婷激情小说网 | 97视频免费观看2区 亚洲视屏 | 国产成人精品不卡 | 黄色片亚洲 | 在线免费看黄网站 | 亚洲午夜精品久久久久久久久久久久 | 亚洲精品一区二区三区高潮 | 亚洲午夜久久久久久久久电影网 | 亚洲视频一 | 最近2019年日本中文免费字幕 | 色 免费观看| 午夜色站| 天天摸日日摸人人看 | 免费观看第二部31集 | 天天综合网在线观看 | 成人免费观看视频网站 | 午夜精品久久久久久久久久久 | 六月色丁香 | 欧美精品在线视频观看 | 99热这里只有精品免费 | av韩国在线| 亚洲区精品视频 | 久草在线观看资源 | 亚洲国产精品成人综合 | 久久一区二区三区国产精品 | 国语精品久久 | 亚洲激情综合 | 国产色婷婷精品综合在线手机播放 | 高清免费av在线 | 黄色片网站av | 夜又临在线观看 | 亚洲 欧洲 国产 日本 综合 | 欧美了一区在线观看 | 国产精品11 | 91成人黄色 | 五月婷婷色播 | 日日夜夜人人天天 | 久久综合影院 | 在线观看日韩专区 | 免费在线观看成人av | www.色午夜,com| a级黄色片视频 | 伊人天天操 | 亚洲福利精品 | 婷婷伊人综合 | 中文字幕高清视频 | 亚洲成人精品av | 中文免费观看 | 天天色天天射天天操 | 欧美a级片免费看 | 午夜精品一区二区三区免费视频 | 亚洲综合在线观看视频 | 天天干人人 | 狠狠干在线 | 911国产 | 日韩一区二区三区高清在线观看 | 51久久夜色精品国产麻豆 | 欧洲av不卡 | 日本少妇视频 | 日韩精品一区电影 | 国产精品色婷婷视频 | 成人免费视频在线观看 | 国产偷v国产偷∨精品视频 在线草 | 日韩av中文字幕在线免费观看 | 美女在线免费视频 | 午夜美女wwww | 天天干中文字幕 | 日韩中文字幕视频在线观看 | 亚洲精品成人免费 | 精品99在线观看 | 福利一区二区 | 欧美国产日韩在线视频 | 久久99网| 九九99视频 | 在线观看免费福利 | 日韩av看片 | 亚洲成人免费在线 | 色爱区综合激月婷婷 | 91九色视频在线 | 午夜美女影院 | 天天射天 | 日韩一级片网址 | 国产麻豆视频免费观看 | 中文字幕视频三区 | 最近字幕在线观看第一季 | 91爱爱电影 | 国产精品欧美久久久久天天影视 | 久久99精品热在线观看 | 国产福利中文字幕 | 亚洲综合在线五月 | 中文字幕亚洲欧美日韩 | 国产资源网站 | 99久久精品免费看国产四区 | 国产理论免费 | 久久综合九色综合久久久精品综合 | 欧美久久久久久久久久久久久 | 婷婷视频在线观看 | 免费在线成人 | 色在线视频 | 日韩在线看片 | 国产高清精 | 免费在线观看日韩视频 | 亚洲成av人电影 | 五月天av在线 | 欧美精品999| 国产午夜精品一区二区三区嫩草 | 日韩午夜一级片 | 久要激情网| 在线观看免费视频你懂的 | 天天操狠狠操 | 国产人成看黄久久久久久久久 | 四虎www.| 亚洲成成品网站 | 亚洲视频在线免费看 | 在线观看一级片 | 亚洲污视频 | 91桃色在线观看视频 | av电影中文字幕 | 亚洲精品理论 | www.五月婷| 色99之美女主播在线视频 | 香蕉91视频| 亚洲精品国产综合99久久夜夜嗨 | 在线看一区二区 | 91精品一区二区三区蜜桃 | 日韩欧美在线观看 | 日韩美在线观看 | 成人av免费在线 | 欧美一级大片在线观看 | 最近中文字幕完整视频高清1 | 久久久久久免费视频 | 超碰97公开 | 久射网| 97精品欧美91久久久久久 | 日韩视频一区二区三区在线播放免费观看 | 操操操日日日干干干 | 特片网久久 | 久久国产一区二区三区 | 国产一区二区高清不卡 | 亚洲国产中文字幕在线视频综合 | 国产无遮挡又黄又爽在线观看 | 一区二区三区免费网站 | 精品在线观看一区二区 | 国产高清一| 欧美精品第一 | 精品国产黄色片 | 一区二区三区在线播放 | 国产成人黄色 | bbbb操bbbb| 1024手机基地在线观看 | 99精品视频免费观看 | 久久黄色免费视频 | 久久艹综合| 91九色在线观看 | 日黄网站| 91免费视频黄 | av成人黄色| 国产裸体bbb视频 | 四虎在线视频免费观看 | 精品在线亚洲视频 | 色综合久久88色综合天天6 | 欧美黑人巨大xxxxx | 久久久www成人免费毛片麻豆 | 日本视频久久久 | 国产精品精品国产色婷婷 | 午夜资源站 | 国产视频97 | 色综合网在线 | 午夜在线观看一区 | 中文字幕丝袜制服 | 精品久久1 | 亚洲区二区 | 女人高潮特级毛片 | 日韩电影精品 | 69视频在线播放 | 国产高清视频免费最新在线 | 中国美女一级看片 | 中文字幕免费国产精品 | 精品自拍网 | 久久久www成人免费毛片 | 成人一级影视 | 99精品在线免费观看 | 99久久精品午夜一区二区小说 | 精品一区二区三区久久久 | 麻豆传媒视频在线免费观看 | 最近日本韩国中文字幕 | 成人啊 v | 99久久久久 | 久久在线看 | 久久神马影院 | 日本久久成人中文字幕电影 | 人人干天天射 | 丁香婷婷色综合亚洲电影 | 欧美日韩国产一区二区三区 | 超碰97人 | 一区二区三区污 | 久久综合久久综合久久综合 | 三级黄在线 | 婷婷午夜天 | 久久精品www人人爽人人 | 久久伊人国产精品 | 国产精品嫩草影院123 | 日韩在线免费播放 | 久久亚洲专区 | 国产手机av | 天天操网 | 国产永久免费 | 欧美日韩国产综合一区二区 | 天天操天天添天天吹 | 国产亚洲精品久久久久久大师 | 日韩免费一级a毛片在线播放一级 | 亚洲第一香蕉视频 | 亚洲三级影院 | 激情网婷婷 | 久视频在线播放 | 激情av网址 | 久亚洲精品| 涩涩网站在线看 | 日本不卡一区二区 | 天天看天天操 | 亚洲国产精品资源 | 91精品国产电影 | 中文在线中文a | 九热精品 | 成片免费观看视频 | 狠狠干 狠狠操 | 国产高清网站 | 日韩av视屏 | 成人在线播放av | 69久久夜色精品国产69 | 色橹橹欧美在线观看视频高清 | 99免费在线观看视频 | 精品一区二区在线观看 | 18岁免费看片 | 久久久精品国产一区二区电影四季 | av一区二区三区在线播放 | av看片在线观看 | 国产成人精品999在线观看 | 成年人黄色在线观看 | 免费在线观看日韩欧美 | 国产不卡一区二区视频 | 韩国av一区 | 一区二区三高清 | 日韩欧美一区二区三区在线观看 | 免费视频一区二区 | 欧美精品久久99 | 久久精品视频播放 | 黄色官网在线观看 | 免费网址你懂的 | 久久亚洲国产精品 | 中文字幕一区二区在线播放 | av线上看 | 亚洲精品视频播放 | 国产精品一区二区中文字幕 | 一区二区三区四区精品视频 | 丁香婷五月 | 国产精品久久一 | 久久久久久久久影院 | 国产在线观看免费观看 | 成年人在线观看网站 | 欧美a性| 在线成人看片 | www.夜夜| 丝袜美腿在线 | 国产精品一区二区果冻传媒 | 国产一区二区综合 | 欧美男同网站 | 久久五月婷婷丁香社区 | 五月婷婷综合激情网 | 国产精品一区二 | 欧美日韩另类在线观看 | 97国产视频 | 国语精品免费视频 | 日韩一级黄色片 | www日日| www.神马久久 | 亚洲特级毛片 | 波多野结衣精品在线 | 91视视频在线直接观看在线看网页在线看 | 国产手机在线视频 | 在线观看一 | 日日草天天干 | 99爱国产精品| 婷婷色在线资源 | 免费国产在线视频 | 色婷婷www | 婷婷综合成人 | 国产精品乱码久久久 | 99久久久久成人国产免费 | av高清免费 | 夜添久久精品亚洲国产精品 | 久久av免费电影 | 男女激情片在线观看 | 国产精品日韩久久久久 | 成人在线免费看 | 久久国产一区 | 国产精品va视频 | 国产视频久久 | 黄色录像av| 欧美日韩激情视频8区 | 国产一级黄色免费看 | 日韩久久精品一区二区三区下载 | 中文字幕精品一区二区三区电影 | 免费av网址在线观看 | 精品国产乱码一区二 | www.福利| 免费男女网站 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 色婷婷丁香| 精品三级av | 99色资源| 91在线中文| 欧美一级片免费 | 欧美精品亚州精品 | 国产高清黄 | 久草视频在线资源 | 国产区在线看 | 天堂网一区二区 | 亚洲精品乱码久久久久久蜜桃不爽 | 一本大道久久精品懂色aⅴ 五月婷社区 | 88av网站 | 天天草天天干天天 | 色资源在线观看 | 国产一二区在线观看 | 最近日本韩国中文字幕 | 婷婷中文字幕在线观看 | av电影在线观看完整版一区二区 | 国产成人精品亚洲a | 久久精品99视频 | 国产精品毛片久久久久久久 | 久久97超碰 | 国产一线二线三线性视频 | 久久精彩视频 | 日本中文字幕视频 | 超碰97公开 | 国产精品18久久久久久vr | 日韩av不卡在线观看 | 午夜影院三级 | 天天干夜夜爱 | 激情中文在线 | 成人中文字幕在线观看 | 精品一区二区三区电影 | 亚洲理论在线观看 | 午夜精品99久久免费 | 久99久在线 | 91精品视频在线观看免费 | 美女av免费| 色婷婷国产在线 | 婷婷在线免费观看 | 国产视频久久 | 中文字幕人成乱码在线观看 | 97视频总站 | 91视频3p| 99久久久久久国产精品 | 亚洲 欧美 精品 | 欧美一级片在线免费观看 | 黄色1级毛片 | 亚洲六月丁香色婷婷综合久久 | 亚洲一区二区视频在线 | 久久久久久久国产精品影院 | 亚洲成人家庭影院 | 成人h视频 | 欧美日韩精品在线观看 | 久久色亚洲 | 久久夜色电影 | 免费成人在线视频网站 | 国产区av在线 | 一二三久久久 | 色婷婷婷| 亚洲在线成人精品 | 伊甸园av在线 | 日韩在线观看视频在线 | 亚洲视频综合 | 久草在线最新免费 | 日韩成人精品一区二区 | 开心丁香婷婷深爱五月 | 亚洲国产美女久久久久 | 国产一区二区精品久久91 | 精品一二三区 | 日韩在线国产 | 黄色软件在线观看 | 亚州av网站 | 亚洲精品国产综合99久久夜夜嗨 | 五月婷婷狠狠 | 97综合视频 | 在线观看一区视频 | 超碰激情在线 | 成人网444ppp | 色婷婷导航 | 99re视频在线观看 | 国产在线免费 | 美女黄网久久 | www夜夜操 | 久久久久久中文字幕 | 国产99自拍 | 91av视屏 | 日本中文字幕网站 | 婷婷四房综合激情五月 | 中文字幕丝袜制服 | 极品嫩模被强到高潮呻吟91 | 欧美精品九九99久久 | 免费视频一二三区 | 国产一级视频在线 | 黄色aaa级片| 久久韩国免费视频 | 中文字幕在线一区二区三区 | 久久精品1区 | 日韩欧美在线免费 | 日韩欧美在线播放 | 国产精品a级 | 夜色成人av | 国产美女网站在线观看 | 亚洲男模gay裸体gay | 国产精品a久久 | 国产在线观看免费 | 国产伦精品一区二区三区照片91 | av理论电影 | 在线黄av| 色婷婷六月天 | 美女久久视频 | 国产精品久久久久久五月尺 | 久草观看视频 | 国产99久久九九精品免费 | 日韩在线视频不卡 | 娇妻呻吟一区二区三区 | 婷婷中文字幕在线观看 | 西西44人体做爰大胆视频 | 在线国产高清 | 97综合网| 国产亚洲亚洲 | 三级动图 | 色婷婷综合视频在线观看 | 久久网址 | 久久一级片 | 天天综合网在线观看 | 三上悠亚一区二区在线观看 | av资源在线观看 | 久久女教师 | 日韩性色| 国内三级在线 | 国内亚洲精品 | 六月激情婷婷 | 免费观看全黄做爰大片国产 | 成人av资源在线 | 免费看片成人 | 婷婷精品视频 | 五月天久久综合网 | 亚洲精品乱码久久久久久写真 | 麻豆精品传媒视频 | 伊人久久精品久久亚洲一区 | 玖操 | 中文字幕 在线看 | 精品一二三四五区 | 天天天天爱天天躁 | av在线免费不卡 | 91视频啊啊啊 | 国产剧情一区在线 | 丁香婷婷激情国产高清秒播 | 久草在线视频网 | 国产精品男女啪啪 | 国产精品va最新国产精品视频 | 日韩在线观看视频在线 | 91中文字幕在线播放 | va视频在线| 久久99在线 | 国产黄色大片免费看 | 欧美一区二区在线刺激视频 | 久久免费在线观看视频 | 在线观看精品 | 亚洲人成精品久久久久 | av在线超碰 | 色婷婷激情电影 | 免费视频色 | 国产偷在线| 国产一区二区三区免费观看视频 | av888av.com| 国产在线一线 | 在线观看视频黄色 | 久久99视频免费观看 | 日韩精品综合在线 | 国产日韩欧美在线观看 | 日韩欧美国产精品 | 免费日韩一区二区三区 | 97精品电影院 | 91网站在线视频 | 国产精品黑丝在线观看 | 激情五月婷婷 | 一区二区三区在线观看中文字幕 | 天堂av在线网站 | 国产视频99| 欧美视频国产视频 | 四虎在线免费观看 | 日韩一区视频在线 | 免费av看片 | 婷婷六月综合网 | 在线免费亚洲 | 天天干干 | 亚洲性xxxx| 91精品国产福利 | 91免费在线视频 | 最新中文在线视频 | 午夜在线观看 | 探花视频在线版播放免费观看 | 国产精品com | 久久视频一区 | 人人澡人人澡人人 | 伊香蕉大综综综合久久啪 | 激情综合网天天干 | 色91在线视频 | 天天操夜夜看 | 婷婷av色综合 | 亚洲作爱视频 | 色婷婷国产精品 | 亚州精品天堂中文字幕 | 9797在线看片亚洲精品 | 国产精品美女久久久久久网站 | 欧美a级在线播放 | 久久试看 | 中文字幕高清 | 国产精品久久久久影视 | 久久精品一区 | www.狠狠操.com | 麻豆果冻剧传媒在线播放 | 91av超碰| 日韩高清不卡一区二区三区 | 精品在线不卡 | 国内揄拍国产精品 | 涩涩爱夜夜爱 | 欧美精品乱码99久久影院 | 亚洲精品视频在线 | 新av在线| 中文字幕在线影院 | 亚洲一区二区三区在线看 | 亚洲不卡av一区二区三区 | 综合网天天 | 日韩视频中文 | 亚洲五月激情 | 99九九99九九九视频精品 | 国产少妇在线观看 | 国产精品久久99 | 午夜婷婷在线观看 | av一级久久 | 亚洲mv大片欧洲mv大片免费 | 毛片美女网站 | 2019中文字幕网站 | 国产一级在线免费观看 | 精品国产aⅴ麻豆 | 91九色视频在线 | 久久久夜色 | 日韩一区正在播放 | 一区二区视频在线观看免费 | 九色91在线 |