Kho tiền MySQL

Một thẻ đã tồn tại với tên chi nhánh được cung cấp. Nhiều lệnh Git chấp nhận cả tên thẻ và tên nhánh, vì vậy việc tạo nhánh này có thể gây ra hành vi không mong muốn. Bạn có chắc chắn muốn tạo nhánh này không?

Trong bài đăng trước, tôi đã thảo luận về việc sử dụng GPG để bảo mật thông tin đăng nhập cơ sở dữ liệu của bạn. Điều này phụ thuộc vào bản sao cục bộ của cấu hình máy khách MySQL của bạn, nhưng nếu bạn muốn giữ thông tin đăng nhập được lưu trữ an toàn cùng với thông tin siêu bí mật khác thì sao?

Bài đăng này sẽ xem xét cách sử dụng Vault để lưu trữ thông tin đăng nhập của bạn ở vị trí trung tâm và sử dụng chúng để truy cập cơ sở dữ liệu của bạn. Đối với những người chưa biết đến Vault, đây là một cách tuyệt vời để quản lý bí mật của bạn – bảo mật, lưu trữ và kiểm soát chặt chẽ quyền truy cập. Nó có các lợi ích bổ sung là có thể xử lý việc cho thuê, thu hồi chìa khóa, cán chìa khóa và kiểm tra

Trong bài đăng trên blog này, chúng tôi sẽ hoàn thành các nhiệm vụ sau

  1. để sử dụng cho API của Vault và tự động gia hạn chứng chỉ
  2. để chạy dưới một người dùng bị hạn chế và truy cập an toàn vào các tệp và API của nó
  3. để cung cấp kiểm soát truy cập
  4. và tạo chứng chỉ ứng dụng khách tự ký bằng OpenSSL để sử dụng với ứng dụng khách của chúng tôi

Trước khi tiếp tục, tôi nên gửi một ghi chú nhanh để nói rằng sau đây là một ví dụ nhanh để chỉ cho bạn cách bạn có thể thiết lập và chạy Vault cũng như sử dụng nó với MySQL, đây không phải là hướng dẫn thiết lập sản xuất và không đề cập đến Cao


thời gian tải xuống

Chúng tôi sẽ sử dụng một số công cụ ngoài Vault, Let's Encrypt, OpenSSL và json_pp (tiện ích dòng lệnh sử dụng JSON. PP). Đối với bài đăng này, chúng tôi sẽ sử dụng Ubuntu 16. 04 LTS và chúng tôi cho rằng chúng chưa được cài đặt

1

$ sudo apt - get install letsencrypt openssl libjson-pp-perl

Nếu bạn chưa nghe nói về Let's Encrypt thì đó là Cơ quan cấp chứng chỉ (CA) miễn phí, tự động và mở cho phép bạn bảo mật trang web của mình hoặc các dịch vụ khác mà không phải trả tiền cho chứng chỉ SSL; . Electronic Frontier Foundation (EFF) cung cấp Certbot, công cụ được đề xuất để quản lý chứng chỉ của bạn, đây là tên mới của phần mềm letsencrypt. Nếu bạn không có letencrypt/certbot trong trình quản lý gói của mình thì bạn có thể sử dụng phương pháp cài đặt nhanh. Chúng tôi sẽ sử dụng json_pp để chỉnh sửa đầu ra JSON từ API Vault và openssl để tạo chứng chỉ ứng dụng khách

Chúng tôi cũng cần tải xuống Vault, chọn tệp nhị phân phù hợp với Hệ điều hành và kiến ​​trúc của bạn. Tại thời điểm viết bài này, phiên bản mới nhất của Vault là 0. 6. 2, vì vậy các bước sau có thể cần điều chỉnh nếu bạn sử dụng phiên bản khác

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

# Tải xuống Vault (Linux x86_64), SHA256SUMS và chữ ký

$ wget https. // bản phát hành. hashicorp. com / kho tiền / 0. 6. 2 / vault_0. 6. 2_linux_amd64. nén

  https. // bản phát hành. hashicorp. com / kho tiền / 0. 6. 2 / vault_0. 6. 2_SHA256TỔNG. dấu hiệu

  https. // bản phát hành. hashicorp. com / kho tiền / 0. 6. 2 / vault_0. 6. 2_SHA256SUMS

 

# Nhập khóa GPG

$ gpg -- máy chủ khóa pgp.mit. edu -- recv - phím 51852D87348FFC4C

 

# Xác minh tổng kiểm tra

$ gpg -- xác minh vault_0.6. 2_SHA256TỔNG. dấu hiệu

gpg. giả sử đã ký dữ liệu trong ` . vault_0.6. 2_SHA256SUMS '

gpg. Chữ ký được lập Thu 06 Tháng 10 . 2016 02:08. 16 BST sử dụng khóa RSA key ID 348FFC4C

gpg. Tốt chữ ký từ "HashiCorp Security

gpg. CẢNH BÁO. Khóa này is không được chứng nhận . with a trusted signature!

gpg.            không có chỉ định < . that the signature belongs to the owner.

Khóa chính dấu vân tay. 91A6 E7F8 5D05 C656 30BE  F189 5185 2D87 348F FC4C

 

# Xác minh tải xuống

$ sha256sum -- kiểm tra <(fgrep vault_0.6. 2_linux_amd64. zip vault_0. 6. 2 SHA256SUMS)

vault_0. 6. 2_linux_amd64. nén. Được

 

# Trích xuất nhị phân

$ sudo giải nén - j vault_0.6. 2_linux_amd64. zip - d / usr/local/bin

Lưu trữ.   vault_0. 6. 2_linux_amd64. nén

  thổi phồng. / usr / local / bin/vault


Hãy mã hóa… tại sao không?

Chúng tôi muốn có thể truy cập Vault từ bất cứ đâu, chúng tôi có thể đặt biện pháp bảo mật bổ sung để ngăn chặn truy cập trái phép, vì vậy chúng tôi cần mã hóa chính mình. Ví dụ sau đây cho thấy thiết lập trên máy chủ công cộng, cho phép CA xác thực yêu cầu của bạn. Thông tin thêm về các phương pháp khác nhau có thể được tìm thấy trong tài liệu Certbot

1

2

3

4

5

6

7

8

9

10

11

12

13

14

$ sudo letsencrypt -- webroot -w /home/www/vhosts/default/public -d myfirstdomain.com - d miền thứ hai của tôi. com

 

# LƯU Ý QUAN TRỌNG

# - Xin chúc mừng. Chứng chỉ và chuỗi của bạn đã được lưu tại

#   /etc/letsencrypt/live/myfirstdomain. com/chuỗi đầy đủ. pem. Chứng chỉ của bạn sẽ

#   hết hạn vào ngày 29-01-2017. Để có được một phiên bản mới hoặc tinh chỉnh này

#   chứng chỉ trong tương lai, chỉ cần chạy lại certbot. Đến

#   gia hạn *tất cả* chứng chỉ của bạn một cách không tương tác, hãy chạy "certbot

# thay mới"

# - Nếu bạn thích Certbot, vui lòng cân nhắc hỗ trợ công việc của chúng tôi bằng cách

#

#   Quyên góp cho ISRG / Let's Encrypt. https. //letsencrypt. tổ chức/quyên góp

#   Quyên góp cho EFF. https. //hiệu quả. org/donate-le

#

Đó là tất cả những gì cần thiết để có được chứng chỉ SAN SSL. Máy chủ thực thi điều này có một máy chủ web công cộng phục vụ các miền mà chứng chỉ được yêu cầu. Trong quá trình yêu cầu, một tệp được đặt trong webroot đã chỉ định và được sử dụng để xác thực (các) miền cho yêu cầu. Về cơ bản, lệnh cho biết

tên miền đầu tiên của tôi. com và tên miền thứ hai của tôi. com sử dụng /home/www/vhosts/default/public cho thư mục gốc của tài liệu, vì vậy hãy đặt các tệp của bạn ở đó

Let's Encrypt CA phát hành các chứng chỉ có thời hạn sử dụng ngắn (90 ngày), vì vậy bạn cần tiếp tục gia hạn chúng, nhưng đừng lo lắng vì việc tạo chúng rất dễ dàng ngay từ đầu. Bạn có thể kiểm tra xem việc gia hạn có hoạt động tốt không bằng cách sau (điều này sẽ gia hạn tất cả các chứng chỉ mà bạn có mà không có --dry-run)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

$ sudo letsencrypt renew -- dry-run

 

#

#-------------------------------------------------

#Đang xử lý /etc/letsencrypt/renewal/myfirstdomain. com. conf

#-------------------------------------------------

#** CHẠY KHÔ. mô phỏng 'letsencrypt gia hạn' gần hết hạn chứng chỉ

#** (Chứng chỉ kiểm tra bên dưới chưa được lưu. )

#

#Xin chúc mừng, tất cả các lần gia hạn đã thành công. Các chứng chỉ sau đã được gia hạn

#  /etc/letsencrypt/live/myfirstdomain. com/chuỗi đầy đủ. pem (thành công)

#** CHẠY KHÔ. mô phỏng 'letsencrypt gia hạn' gần hết hạn chứng chỉ

#** (Chứng chỉ kiểm tra ở trên chưa được lưu. )

#

# LƯU Ý QUAN TRỌNG

# - Thông tin đăng nhập tài khoản của bạn đã được lưu trong Certbot của bạn

#   thư mục cấu hình tại /etc/letsencrypt. Bạn nên làm một

#   sao lưu an toàn thư mục này ngay bây giờ. Thư mục cấu hình này sẽ

#   cũng chứa các chứng chỉ và khóa cá nhân do Certbot thu được, vì vậy

#   thực hiện sao lưu thư mục này thường xuyên là điều lý tưởng

tự động gia hạn

Quá trình chạy thử nghiệm để gia hạn hoạt động tốt, vì vậy giờ đây chúng tôi có thể bắt đầu và lên lịch để quá trình này diễn ra tự động. Tôi đang sử dụng systemd nên ví dụ sau sử dụng bộ hẹn giờ, nhưng cũng có thể sử dụng cron hoặc tương tự. Đây là cách làm cho systemd chạy gia hạn theo lịch trình cho bạn, chạy lúc 06:00 – quy trình gia hạn sẽ tự động tiếp tục đối với mọi chứng chỉ đã nhận được trước đó hết hạn sau chưa đầy 30 ngày

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

$ sudo cat <<EOF > /etc/systemd/system/cert-renewal.service

[Đơn vị]

Mô tả = SSL gia hạn

 

[Dịch vụ]

Loại = đơn giản

ExecStart =/ usr / bin/letsencrypt renew --quiet

Người dùng = root

Nhóm = gốc

EOF

 

$ sudo cat <<EOF > /etc/systemd/system/cert-renewal.timer

[Đơn vị]

Mô tả = Tự động SSL gia hạn

 

[Hẹn giờ]

OnCalendar =*-*-* 06. 00. 00

Không đổi = true

 

[Cài đặt]

WantedBy = bộ hẹn giờ. mục tiêu

EOF

 

$ sudo systemctl bật chứng chỉ-renewal.timer

Đã tạo liên kết tượng trưng từ / vv/systemd/system/timers.target. muốn / chứng chỉ - gia hạn. hẹn giờ đến / v.v / . hẹn giờ/system/cert-renewal.timer.

 

$ sudo systemctl start cert-renewal.timer

$ sudo systemctl list - timers

TIẾP                                  TRÁI     CUỐI CÙNG                            ĐẠT ĐƠN VỊ ACTIVATES

Thứ 3 2016 - 11 - 01 06:00. 00 UTC  6h left< . hẹn giờ  n/a                          n/a    cert-renewal.timer           chứng chỉ - gia hạn. dịch vụ


Bắt đầu với Vault

Đầu tiên, một lời nhắc nhanh rằng đây không phải là bài đánh giá chuyên sâu, cách cài đặt Vault như thế nào hoặc nhất thiết phải thực hành tốt nhất vì điều đó nằm ngoài phạm vi của bài đăng này. Nó chỉ giúp bạn thử nghiệm mọi thứ, vì vậy vui lòng đọc tài liệu về Vault nếu bạn muốn sử dụng nó một cách nghiêm túc hơn

Mặc dù có một máy chủ phát triển mà bạn có thể kích hoạt bằng lệnh vault server -dev để tự kiểm tra nhanh hơn một chút, nhưng chúng tôi sẽ mất thêm một chút thời gian để tự định cấu hình và làm cho dữ liệu ổn định. Vault hỗ trợ một số chương trình phụ trợ để lưu trữ dữ liệu, bao gồm Zookeeper, Amazon S3 và MySQL, tuy nhiên, 3 chương trình phụ trợ được HashiCorp duy trì là consul, tệp và inmem. Chương trình phụ trợ lưu trữ bộ nhớ không cung cấp dữ liệu liên tục, do đó, trong khi có thể sử dụng cho việc này, nó thực sự chỉ hữu ích cho việc phát triển và thử nghiệm – đó là chương trình phụ trợ lưu trữ được sử dụng với tùy chọn -dev cho lệnh máy chủ. Thay vì giải quyết việc cài đặt và cấu hình Consul trong bài đăng này, chúng tôi sẽ sử dụng lưu trữ tệp thay thế

Trước khi khởi động máy chủ, chúng tôi sẽ tạo một cấu hình, cấu hình này có thể được viết bằng một trong 2 định dạng – HCL (Ngôn ngữ cấu hình HashiCorp) hoặc JSON (Ký hiệu đối tượng JavaScript). Chúng tôi sẽ sử dụng HCL vì nó sạch hơn một chút và giúp chúng tôi tiết kiệm thêm một chút khi gõ

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

# Tạo người dùng hệ thống

$ sudo useradd - r -g daemon -d /usr/local/vault -m -s /sbin/nologin -c "Vault user" vault

$ id kho tiền

uid = 998(kho tiền) gid=1(daemon) groups=1(daemon)

 

# Tạo thư mục cấu hình xóa quyền truy cập toàn cầu

$ sudo mkdir / vv/vault /etc/ssl/vault

$ sudo chown kho. root / etc / vault /etc/ssl/vault

$ sudo chmod 750 / etc/vault /etc/ssl/vault

$ sudo chmod 700 / usr/local/vault

 

# Sao chép chứng chỉ và khóa

$ sudo cp - v /etc/letsencrypt/live/myfirstdomain.com /* pem / etc/ssl/vault

/ vv / letsencrypt / live/myfirstdomain.com / chứng chỉ. pem - > / vv . pem ssl/vault/cert.pem

/ vv / letsencrypt / live/myfirstdomain.com / chuỗi. pem - > / vv . pem ssl/vault/chain.pem

/ vv / letsencrypt / live/myfirstdomain.com / chuỗi đầy đủ. pem - > / vv . pem ssl/vault/fullchain.pem

/ vv / letsencrypt / live/myfirstdomain.com / khóa riêng tư. pem - > / vv . pem ssl/vault/privkey.pem

 

# Tạo chứng chỉ PEM kết hợp

$ sudo cat / vv/ssl/vault/{cert,fullchain}.pem / vv / ssl . pem vault/fullcert.pem

 

# Ghi cấu hình vào tập tin

$ con mèo <<EOF | sudo tee / etc / . hcl vault/demo.hcl

người nghe "tcp" {

  địa chỉ = "10. 0. 1. 10. 8200"

  tls_disable = 0

  tls_cert_file = "/etc/ssl/vault/fullcert. pem"

  tls_key_file = "/etc/ssl/vault/privkey. pem"

}

 

phụ trợ "tệp" {

  đường dẫn = "/usr/local/vault/data"

}

 

disable_mlock = true

EOF

Vì vậy, chúng tôi hiện đã thiết lập một người dùng và một số thư mục để lưu trữ cấu hình, chứng chỉ SSL và khóa cũng như dữ liệu, hạn chế quyền truy cập đối với người dùng vault. Cấu hình mà chúng tôi đã viết xác định rằng chúng tôi sẽ sử dụng tệp phụ trợ, lưu trữ dữ liệu trong /usr/local/vault/data và trình nghe sẽ cung cấp mã hóa TLS bằng chứng chỉ của chúng tôi từ Let's Encrypt. Cài đặt cuối cùng, json_pp0 không được đề xuất cho sản xuất và đang được sử dụng để tránh một số cấu hình bổ sung trong bài đăng này. Bạn có thể tìm thêm chi tiết về các tùy chọn khác có sẵn để cấu hình trong phần Cấu hình máy chủ của tài liệu trực tuyến

Xin lưu ý rằng thư mục dữ liệu của Vault phải được bảo mật vì nó chứa tất cả các khóa và bí mật. Trong ví dụ này, chúng tôi đã thực hiện việc này bằng cách đặt nó trong thư mục chính của người dùng vault và chỉ cho phép người dùng vault truy cập. Bạn có thể thực hiện điều này hơn nữa bằng cách hạn chế quyền truy cập cục bộ (thông qua thông tin đăng nhập) và danh sách kiểm soát quyền truy cập

Bắt đầu Vault

Đã đến lúc khởi động máy chủ và xem mọi thứ có ổn không

1

2

3

4

5

6

7

8

9

10

11

$ sudo - su vault vault server -config=/etc/vault/demo.hcl > / tmp / . log-debug.log 2>&1 &

$ việc làm

[1]   + running    sudo -su vault vault server -config=/etc/vault/demo.hcl > / tmp / . lo-debug.lo

 

$ VAULT_ADDR = https. // tên miền đầu tiên của tôi. com. 8200 kho trạng thái

Lỗi kiểm tra con dấu trạng thái. Lỗi thực hiện API yêu cầu.

 

URL. NHẬN https. // tên miền đầu tiên của tôi. com. 8200 / v1 / sys/seal-status

. 400. Lỗi.

 

* máy chủ chưa chưa initialized

Mặc dù có vẻ như đã xảy ra sự cố (chúng tôi cần khởi tạo máy chủ), điều đó có nghĩa là mọi thứ đang hoạt động như mong đợi. Vì vậy, chúng tôi sẽ khởi tạo Vault, đây là một nhiệm vụ khá đơn giản, nhưng bạn cần ghi chú/lưu trữ một số thông tin mà máy chủ sẽ cung cấp cho bạn trong quá trình khởi tạo – mã thông báo chưa niêm phong và khóa gốc ban đầu. Bạn nên phân phối những thứ này đến nơi an toàn, nhưng bây giờ chúng tôi sẽ lưu trữ chúng với cấu hình

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

# Thay đổi thành người dùng vault

$ sudo su - l vault -s /bin/bash

(kho tiền)$ xuất VAULT_ADDR=https: // tên miền đầu tiên của tôi. com. 8200 VAULT_SSL =/ vv/ssl/vault

 

# Khởi tạo Vault và lưu mã thông báo cũng như khóa

(kho tiền)$ kho tiền init 2>&1 | egrep '^Khóa Unseal. Mã thông báo gốc ban đầu' > / v.v / vault/keys.txt

(kho tiền)$ chmod 600 /etc/vault/keys.txt

 

# Bỏ niêm phong kho tiền

(kho tiền)$ egrep -m3 '^Unseal Key' /etc/vault/keys.txt . cắt - f2 - - . d: . tr - d ' ' .

trong khi đọc phím

làm

  kho tiền mở niêm phong

     - ca - chứng chỉ=${VAULT_SSL}/fullchain.pem

     - khách hàng - chứng chỉ=${VAULT_SSL}/client.pem

     - khách hàng - khóa=${VAULT_SSL}/privkey.pem ${key}

xong

Đã niêm phong. đúng

Khóa Chia sẻ. 5

Khóa Ngưỡng. 3

Mở niêm phong Tiến trình. 1

Đã niêm phong. đúng

Khóa Chia sẻ. 5

Khóa Ngưỡng. 3

Mở niêm phong Tiến trình. 2

Đã niêm phong. sai

Khóa Chia sẻ. 5

Khóa Ngưỡng. 3

Mở niêm phong Tiến độ. 0

 

# Kiểm tra trạng thái Vault

(kho tiền)$ kho tiền status

Đã niêm phong. sai

Khóa Chia sẻ. 5

Khóa Ngưỡng. 3

Mở niêm phong Tiến độ. 0

Phiên bản. 0. 6. 2

Cụm Tên. kho tiền - cụm - ebbd5ec7

Cụm ID. 61ae8f54 - f420 - 09c1-90bb-60c9fbfa18a2

 

Cao - Tính khả dụng Đã bật. sai

Vậy là xong, kho tiền được khởi tạo và lệnh trạng thái hiện trả về thông tin chi tiết và xác nhận rằng nó đang hoạt động. Điều đáng chú ý ở đây là mỗi khi bạn khởi động Vault, nó sẽ được niêm phong, điều đó có nghĩa là không thể truy cập vào Vault cho đến khi 3 khóa chưa niêm phong được sử dụng với json_pp1 – để tăng cường bảo mật ở đây, bạn sẽ đảm bảo rằng một người không thể biết bất kỳ 3 khóa nào,


Thiết lập chính sách

Chính sách cho phép bạn đặt giới hạn kiểm soát quyền truy cập để xác định dữ liệu mà người dùng được xác thực có quyền truy cập. Một lần nữa, các tài liệu được sử dụng để viết chính sách ở định dạng HCL hoặc JSON. Chúng rất dễ viết và áp dụng, nhược điểm duy nhất là các chính sách liên quan đến mã thông báo không thể thay đổi (thêm/xóa) sau khi mã thông báo đã được phát hành; . Tuy nhiên, nếu bạn muốn thay đổi các quy tắc chính sách thì điều này có thể được thực hiện nhanh chóng khi các sửa đổi được áp dụng trong lệnh gọi tiếp theo tới Vault

Khi chúng tôi khởi tạo máy chủ, chúng tôi đã được cung cấp khóa gốc ban đầu và bây giờ chúng tôi cần sử dụng khóa đó để bắt đầu định cấu hình máy chủ

1

(kho tiền)$ xuất VAULT_TOKEN=$(egrep '^Initial Root Token:' / vv / kho tiền . txt keys.txt . cắt - f2 - - . d: . tr - d ' ')

Chúng tôi sẽ tạo một chính sách đơn giản cho phép chúng tôi đọc các bí mật của MySQL, nhưng ngăn truy cập vào các lệnh và thông tin hệ thống

1

2

3

4

5

6

7

8

9

10

11

12

13

(kho tiền)$ cat <<EOF > /etc/vault/demo-policy.hcl

đường dẫn "sys/*" {

  chính sách = "từ chối"

}

 

đường dẫn "secret/mysql/*" {

  chính sách = "đã đọc"

  khả năng = ["danh sách", "sudo"]

}

EOF

 

(kho tiền)$ kho tiền policy-write demo /etc/vault/demo-policy.hcl

Chính sách 'demo' được viết.

Chúng tôi chỉ thêm một chính sách ở đây, nhưng bạn thực sự nên tạo nhiều chính sách nếu cần để kiểm soát quyền truy cập một cách phù hợp giữa nhiều người và ứng dụng có thể đang sử dụng dịch vụ. Như với bất kỳ loại lưu trữ dữ liệu nào, việc lập kế hoạch lưu trữ dữ liệu của bạn như thế nào là rất quan trọng, vì nó sẽ giúp bạn viết các chính sách nhỏ gọn hơn với mức độ chi tiết mà bạn yêu cầu. Viết mọi thứ bằng json_pp2 ở cấp cao nhất rất có thể sẽ khiến bạn đau đầu hoặc định nghĩa chính sách dài


Xác thực TLS cho các bí mật của MySQL

Chúng tôi sắp thêm bí mật đầu tiên của mình vào Vault, nhưng trước hết, chúng tôi cần một cách để xác thực quyền truy cập của mình. Vault cung cấp một API để truy cập vào các bí mật được lưu trữ của bạn, cùng với vô số lệnh sử dụng trực tiếp tệp nhị phân vault như chúng tôi đang làm vào lúc này. Bây giờ chúng ta sẽ kích hoạt phụ trợ xác thực json_pp4, cho phép xác thực bằng chứng chỉ ứng dụng khách SSL/TLS

1

2

(kho tiền)$ kho tiền auth-enable cert

Đã kích hoạt thành công enabled 'cert' at 'cert' . !

Tạo chứng chỉ ứng dụng khách bằng OpenSSL

Chương trình phụ trợ xác thực TLS chấp nhận các chứng chỉ được ký bởi CA hoặc tự ký, vì vậy, hãy nhanh chóng tạo cho mình một chứng chỉ SSL tự ký bằng cách sử dụng openssl để sử dụng để xác thực

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

# Tạo thư mục làm việc để quản lý SSL và sao chép trong cấu hình

$ mkdir ~ / . ssl && cd $_

$ cp / usr / lib/ssl/openssl.cnf .

 

# Tạo CA 4096-bit

$ openssl genrsa - des3 -out ca.key 4096

Tạo RSA khóa riêng tư, 4096 bit long modulus

.. . . . . . . . . . ++

.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ++

e 65537 (0x10001)

Nhập vượt qua cụm từ cho ca.key.

Xác minh - Nhập thông qua cụm từ for ca.key.

 

$ openssl req - config . / openssl. cnf - mới - x509 . khóa days 365 -key ca.key - ra ca. crt

Nhập vượt qua cụm từ cho ca.key.

Bạn đang sắp đến asked to enter information that will be incorporated

vào chứng chỉ của bạn yêu cầu.

Cái bạn là gì về đến enter is what is called a Distinguished Name or a DN.

khá a ít fields but you can leave some blank

Đối với một số trường ở đó sẽ be a default value,

Nếu bạn nhập '. ', trường sẽ . left blank.

-----

Quốc gia Tên (2 chữ cái code) [GB]:

Tiểu bang hoặc Tỉnh Tên (full name) [Some-State]:

Địa phương Tên (ví dụ, city) [Some-Place]:

Tổ chức Tên (ví dụ:, company) [Percona]:

Tổ chức Đơn vị Tên (ví dụ, section) [Demo]:

Tên Thông thường (e. g. máy chủ FQDN hoặc tên CỦA BẠN . ) [ceri]:

Email Địa chỉ [thisisnotme@myfirstdomain.com].

 

# Tạo Khóa máy khách 4096-bit và CSR

$ openssl genrsa - des3 -out client.key 4096

Tạo RSA khóa riêng tư, 4096 bit long modulus

.. . . . . . . . . . . . . . . . . . . . . ++

.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ++

e 65537 (0x10001)

Nhập pass cụm từ cho khách hàng.key.

Xác minh - Nhập thông qua cụm từ for client.key.

 

$ openssl req - config . / openssl. cnf - mới - khóa . khóa.key - ra máy khách. csr

Nhập pass cụm từ cho khách hàng.key.

Bạn đang sắp đến asked to enter information that will be incorporated

vào chứng chỉ của bạn yêu cầu.

Cái bạn là gì về đến enter is what is called a Distinguished Name or a DN.

khá a ít fields but you can leave some blank

Đối với một số trường ở đó sẽ be a default value,

Nếu bạn nhập '. ', trường sẽ . left blank.

-----

Quốc gia Tên (2 chữ cái code) [GB]:

Tiểu bang hoặc Tỉnh Tên (full name) [Some-State]:

Địa phương Tên (ví dụ, city) [Some-Place]:

Tổ chức Tên (ví dụ:, company) [Percona]:

Tổ chức Đơn vị Tên (ví dụ, section) [Demo]:

Tên Thông thường (e. g. máy chủ FQDN hoặc tên CỦA BẠN . ) [ceri]:

Email Địa chỉ [thisisnotme@myfirstdomain.com].

 

Vui lòng nhập các sau 'bổ sung' attributes

để được gửi với của bạn certificate request

A thử thách mật khẩu []:

Một tùy chọn tên công ty tên []:

 

# Tự ký

$ openssl x509 - req -days 365 -in client.csr - CA ca. crt - CAkey ca. khóa - set_serial 01 - . crtclient.crt

Chữ ký ok

subject =/ C = GB/ST=Some-State/L=Some-Place/O=Percona/OU=Demo/CN=ceri/emailAddress=thisisnotme@myfirstdomain.com

Nhận CA Khóa Riêng tư

Nhập vượt qua cụm từ cho ca.key.

 

# Tạo một bản sao không được mã hóa của khóa máy khách

$ openssl rsa - in client.key - ra khóa riêng tư. pem

Nhập pass cụm từ cho khách hàng.key.

ghi RSA khóa

 

# Sao chép chứng chỉ để truy cập Vault

$ sudo cp khách hàng. crt / etc / ssl . pem vault/user.pem

OK, có khá nhiều thông tin ở đó. Bạn có thể chỉnh sửa json_pp6 để đặt giá trị mặc định hợp lý cho mình và tiết kiệm thời gian. Tóm lại, chúng tôi đã tạo CA của riêng mình, tạo chứng chỉ tự ký và sau đó tạo một chứng chỉ PEM duy nhất với khóa được giải mã (điều này tránh chỉ định mật khẩu để sử dụng nó – bạn có thể muốn giữ nguyên mật khẩu để tăng cường bảo mật hơn

Thêm chứng chỉ ủy quyền vào Vault

Bây giờ chúng tôi đã tạo chứng chỉ và chính sách, bây giờ chúng tôi cần cho phép xác thực xảy ra bằng chứng chỉ. Chúng tôi sẽ cung cấp mã thông báo hết hạn trong 1 giờ và cho phép truy cập vào các bí mật của MySQL thông qua chính sách demo mà chúng tôi đã tạo ở bước trước

1

2

3

4

5

6

7

8

9

(kho tiền)$ kho tiền write auth/cert/certs/demo

    display_name = demo

    chính sách = bản trình diễn

    chứng chỉ = @${VAULT_SSL}/user.pem

    ttl = 3600

Thành công. Dữ liệu được ghi đến. auth / chứng chỉ / chứng chỉ/demo

 

$ curl -- chứng chỉ người dùng.pem -- khóa khóa riêng tư. pem ${VAULT_ADDR}/v1/auth/cert/login -X POST

{"request_id". "d5715ce1-2c6c-20c8-83ef-ce6259ad9110","lease_id":"","tái tạo". false,"lease_duration". 0,"dữ liệu". null,"wrap_info". null,"cảnh báo". null,"auth". {"client_token". "e3b98fac-2676-9f44-fdc2-41114360d2fd","trình truy cập":"4c5b4eb5-4faf-0b01-b732-39d309afd216","chính sách":["mặc định","demo"],"metadata":{"authority_key_id". "","cert_name". "demo","common_name". "[email được bảo vệ]","subject_key_id". ""},"lease_duration":600,"tái tạo". true}}

Thật tuyệt vời. Chúng tôi đã yêu cầu mã thông báo ứng dụng khách đầu tiên bằng chứng chỉ ứng dụng khách SSL, chúng tôi đã đăng nhập mã thông báo đó và chúng tôi đã nhận được mã thông báo truy cập (json_pp7) trong phản hồi cung cấp cho chúng tôi hợp đồng thuê 1 giờ (json_pp8) để tiếp tục và thực hiện các yêu cầu với tư cách khách hàng mà không cần


suỵt. Điều đó là bí mật

“Đã đến lúc,” ông chủ Vault nói, “để mã hóa nhiều thứ. các khóa và mật khẩu cũng như các ghi chú tối mật của chúng tôi, các chuỗi và DSN MySQL của chúng tôi. ”

Có lẽ cách dễ nhất để sử dụng Vault với ứng dụng của bạn là lưu trữ thông tin ở đó như cách bạn làm trong tệp cấu hình và đọc nó khi ứng dụng yêu cầu lần đầu. Một ví dụ về thông tin đó là Tên nguồn dữ liệu (DSN) cho kết nối MySQL hoặc có lẽ là thông tin cần thiết để tạo động một json_pp9. Vì đây là về việc sử dụng Vault với MySQL, chúng tôi sẽ thực hiện chính xác điều đó và lưu trữ người dùng, mật khẩu và phương thức kết nối làm bí mật đầu tiên của chúng tôi, đọc lại bằng công cụ dòng lệnh để kiểm tra xem nó có đúng như mong đợi không

1

2

3

4

5

6

7

8

9

10

(kho tiền)$ $ vault write secret/mysql/test password="mysupersecretpassword" user="percona" socket="/var/run/mysqld/mysqld.sock"

Thành công. Dữ liệu được ghi đến. bí mật / mysql / thử nghiệm

 

(kho tiền)$ kho tiền read secret/mysql/test

Khóa                     Giá trị

---                      -----

refresh_interval        768h0m0s

mật khẩu                mật khẩu siêu bí mật của tôi

ổ cắm                   / var / run/mysqld/mysqld.sock

user                    percona

Quay lại một chút (hy vọng chưa đầy 1 giờ trước. ) chúng tôi đã xác thực bằng cách sử dụng cURL và nhận được mã thông báo, vì vậy bây giờ chúng tôi có một số bí mật cần đọc, chúng tôi có thể dùng thử. Sự phô trương và tiếng kèn đã sẵn sàng…

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

$ curl -- chứng chỉ người dùng.pem -- khóa khóa riêng tư. pem - H 'Loại nội dung. ứng dụng/json' - H 'X-Vault-Token. 2f1fb630-cbe9-a8c9-5931-515a12d79291' ${VAULT_ADDR} . /v1/secret/mysql/test -X GET 2>/dev/null | json_pp

{

   "wrap_info" . null,

   "lease_id" . "",

   "request_id" . "c79033b1-f8f7-be89-4208-44d721a55804",

   "auth" . null,

   "dữ liệu" . {

      "mật khẩu" . "mật khẩu siêu bí mật của tôi",

      "ổ cắm" . "/var/run/mysqld/mysqld. vớ",

      "người dùng" . "percona"

   },

   "lease_duration" . 2764800,

   "tái tạo" . sai,

   "cảnh báo" . null

}

Chúng ta làm được rồi. Giờ đây, bạn không cần phải lưu trữ mật khẩu trong mã hoặc tệp cấu hình nữa, bạn chỉ cần truy cập và lấy chúng từ Vault khi cần, chẳng hạn như khi ứng dụng của bạn khởi động và lưu chúng trong bộ nhớ hoặc theo yêu cầu nếu ứng dụng của bạn . Bạn sẽ cần thực hiện các bước tiếp theo để đảm bảo rằng ứng dụng của bạn có thể chịu được việc Vault ngừng hoạt động, cũng như cung cấp thiết lập HA của Vault để giảm thiểu rủi ro không có sẵn các bí mật

Nó không dừng lại ở đây mặc dù…


Cấp phép MySQL theo yêu cầu

Vault hoạt động như một hệ thống tệp ảo và sử dụng phụ trợ lưu trữ chung theo mặc định, được gắn là openssl0, nhưng do tính trừu tượng mạnh mẽ nên có thể sử dụng nhiều phụ trợ khác làm điểm gắn kết, chẳng hạn như cơ sở dữ liệu SQL, AWS IAM, HSM, v.v. Chúng tôi đã giữ mọi thứ đơn giản và đang sử dụng phụ trợ chung cho đến nay. Bạn có thể xem các chương trình phụ trợ (được gắn kết) có sẵn bằng cách sử dụng lệnh openssl1

1

2

3

4

(kho tiền)$ kho tiền mounts

Đường dẫn        Loại       Mặc định TTL  Max TTL  Description

bí mật /      chung    hệ thống       system   generic secret storage

hệ thống /         hệ thống     n/a          n/a      system endpoints used for control, policy and debugging

Bây giờ chúng tôi sẽ kích hoạt phụ trợ MySQL, thêm kết nối quản lý (sẽ sử dụng plugin auth_socket) và sau đó yêu cầu người dùng MySQL mới sẽ tự động hết hạn

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# Tạo tài khoản người dùng MySQL chuyên dụng

$ mysql - Bsse "TẠO NGƯỜI DÙNG [email . * ĐẾN [email được bảo vệ] VỚI TÙY CHỌN CẤP;"

 

# Kích hoạt chương trình phụ trợ MySQL và đặt chi tiết kết nối

(kho tiền)$ kho tiền mount mysql

(kho tiền)$ kho tiền write mysql/config/connection connection_url="vault:[email protected](/var/run/mysqld/mysqld.sock)/"

Đọc quyền truy cập đến điểm cuối này should be controlled via ACLs as it will return the connection URL as it is, including passwords, if any.

 

# Viết mẫu cho vai trò chỉ đọc

(kho tiền)$ kho tiền write mysql/roles/readonly

sql = "TẠO NGƯỜI DÙNG '{{name}}'@'%' ĐƯỢC XÁC ĐỊNH VỚI mysql_native_password BẰNG '{{password}}' . * ĐẾN '{{name}}'@'%';"

Thành công. Dữ liệu được ghi đến. mysql / vai trò / chỉ đọc

 

# Đặt hợp đồng thuê đối với các khoản trợ cấp của MySQL

(kho tiền)$ kho tiền write mysql/config/lease lease=1h lease_max=12h

Thành công. Dữ liệu được ghi đến. mysql / config / thuê

Tại đây, bạn có thể thấy rằng một mẫu đã được tạo để bạn có thể tùy chỉnh các khoản trợ cấp cho mỗi vai trò. Chúng tôi đã tạo vai trò chỉ đọc, vì vậy vai trò này chỉ có quyền truy cập openssl2. Chúng tôi đã đặt thời hạn hết hạn cho tài khoản để MySQL sẽ tự động đánh dấu mật khẩu là đã hết hạn và ngăn truy cập. Điều này không thực sự cần thiết vì Vault sẽ xóa tài khoản người dùng mà nó đã tạo khi hết hạn mã thông báo, nhưng bằng cách thêm một cấp bổ sung trong MySQL, nó sẽ cho phép bạn đặt hợp đồng thuê, có vẻ là toàn cầu, trong Vault lâu hơn một chút . Bạn cũng có thể sử dụng nó như một cách để theo dõi tài khoản MySQL nào do Vault tạo sẽ sớm hết hạn. Phần quan trọng là bạn đảm bảo rằng ứng dụng có thể chịu được việc xác thực lại, cho dù ứng dụng có ngừng hoạt động trong khi làm như vậy hay không, chấp nhận độ trễ tăng thêm hay có lẽ quá trình sẽ kết thúc và hoạt động trở lại

Bây giờ chúng tôi sẽ xác thực và yêu cầu người dùng của chúng tôi kết nối với cơ sở dữ liệu với

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

$ curl -- chứng chỉ người dùng.pem -- khóa khóa riêng tư. pem - H 'Loại nội dung. ứng dụng/json' ${VAULT_ADDR}/v1/auth/cert/login -X POST 2>/dev/null | json_pp

{

   "auth" . {

      "chính sách" . [

         "mặc định",

         "demo"

      ],

      "người truy cập" . "2e6d4b95-3bf5-f459-cd27-f9e35b9bed16",

      "có thể tái tạo" . đúng,

      "lease_duration" . 3600,

      "siêu dữ liệu" . {

         "common_name" . "[email được bảo vệ]",

         "cert_name" . "demo",

         "authority_key_id" . "",

         "subject_key_id" . ""

      },

      "client_token" . "018e6feb-65c4-49f2-ae30-e4fbba81e687"

   },

   "lease_id" . "",

   "wrap_info" . null,

   "tái tạo" . sai,

   "dữ liệu" . null,

   "request_id" . "f00fe669-4382-3f33-23ae-73cec0d02f39",

   "cảnh báo" . null,

   "lease_duration" . 0

}

 

$ curl -- chứng chỉ người dùng.pem -- khóa khóa riêng tư. pem - H 'Loại nội dung. ứng dụng/json' - H 'X-Vault-Token. 018e6feb-65c4-49f2-ae30-e4fbba81e687' ${VAULT_ADDR} . /v1/mysql/creds/readonly -X GET 2>/dev/null | json_pp

{

   "lỗi" . [

      "quyền bị từ chối"

   ]

}

Ồ, chuyện gì đã xảy ra vậy?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

(kho tiền)$ cat <<EOF | kho tiền chính sách - viết bản trình diễn /dev/stdin

đường dẫn "sys/*" {

  chính sách = "từ chối"

}

 

đường dẫn "secret/mysql/*" {

  chính sách = "đã đọc"

  khả năng = ["danh sách", "sudo"]

}

 

đường dẫn "mysql/creds/readonly" {

  chính sách = "đã đọc"

  khả năng = ["danh sách", "sudo"]

}

EOF

Chính sách 'demo' được viết.

Bây giờ chúng tôi đã cập nhật chính sách để cho phép truy cập vào vai trò chỉ đọc (yêu cầu đi qua mysql/creds khi yêu cầu quyền truy cập), chúng tôi có thể kiểm tra xem chính sách đã được áp dụng chưa và liệu chúng tôi có nhận được tài khoản người dùng cho MySQL hay không

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

# Yêu cầu tài khoản người dùng

$ curl -- chứng chỉ người dùng.pem -- khóa khóa riêng tư. pem - H 'Loại nội dung. ứng dụng/json' - H 'X-Vault-Token. 018e6feb-65c4-49f2-ae30-e4fbba81e687' ${VAULT_ADDR} . /v1/mysql/creds/readonly -X GET 2>/dev/null | json_pp

{

   "request_id" . "7b45c9a1-bc46-f410-7af2-18c8e91f43de",

   "lease_id" . "mysql/creds/readonly/c661426c-c739-5bdb-cb7a-f51f74e16634",

   "cảnh báo" . null,

   "lease_duration" . 3600,

   "dữ liệu" . {

      "mật khẩu" . "099c8f2e-588d-80be-1e4c-3c2e20756ab4",

      "tên người dùng" . "read-cert-401f2c"

   },

   "wrap_info" . null,

   "tái tạo" . đúng,

   "auth" . null

}

 

# Kiểm tra quyền truy cập MySQL

$ mysql - h localhost -u read-cert-401f2c -p

Nhập mật khẩu.

Chào mừng đến với trình giám sát MySQL monitor.  Lệnh end with ;< . or g.

Kết nối MySQL của bạn id 17

Phiên bản máy chủ version. 5. 7. 14 - 8 - log Percona Server (GPL), Release '8', Revision '1f84ccd'

 

Bản quyền (c) 2009-2016 Percona LLC and/or its affiliates

Bản quyền (c) 2000, 2016, Oracle and/or its affiliates. Tất cả quyền được bảo lưu.

 

Oracle a đã đăng ký nhãn hiệu of Oracle Corporation and/or its

đơn vị liên kết. Tên khác có thể nhãn hiệuof their respective

chủ sở hữu.

 

Nhập 'trợ giúp;' hoặc 'h' . help. Nhập 'c' để xóa the current input statement.

 

mysql> hiển thị cấp;

+---------------------------------------------------- +

| Giấy phép cho đọc - chứng chỉ . -401f2c@%                 |

+---------------------------------------------------- +

| CẤP CHỌN BẬT * . * ĐẾN 'read-cert-401f2c'@'%' |

+---------------------------------------------------- +

1 hàng trong bộ (0.00 giây)

 

# Hiển thị đầy đủ thông tin tài khoản

$ p - hiển thị - grants --only='read-cert-401f2c'@'%'

-- Các khoản tài trợ được đổ bởi pt-show-grants

-- Đã kết xuất từ máy chủ Localhost via UNIX socket, MySQL 5.7.14 - 8 - log . 2016-11-08 23:28. 37

-- Trợ cấp cho 'read-cert-401f2c'@'%'

TẠO NGƯỜI DÙNG NẾU KHÔNG TỒN TẠI 'read-cert-401f2c'@'%';

THAY ĐỔI NGƯỜI DÙNG 'read-cert-401f2c'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*FF157E33408E1FBE707B5FF89C87A2D14E8430C2' REQUIRE NONE PASSWORD EXPIRE INTERVAL 1 DAY ACCOUNT UNLOCK;

CẤP CHỌN BẬT * . * ĐẾN 'read-cert-401f2c'@'%';

Tiếng hoan hô. Giờ đây, chúng tôi thậm chí không cần phải tạo người dùng, ứng dụng có thể nhận được một người dùng khi cần. Chúng tôi đã đặt tài khoản tự động hết hạn để thông tin đăng nhập chỉ có hiệu lực trong 1 ngày, bất kể thời gian hết hạn của Vault và chúng tôi cũng đã giảm thời gian mã thông báo hợp lệ, vì vậy chúng tôi đã hoàn thành khá tốt công việc

Công dụng của Vault là gì?

Vault cung cấp dịch vụ mã hóa với tính năng quản lý khóa tập trung để đơn giản hóa việc mã hóa dữ liệu khi truyền và lưu trữ trên các đám mây cũng như trung tâm dữ liệu . Vault có thể mã hóa/giải mã dữ liệu được lưu trữ ở nơi khác, về cơ bản cho phép các ứng dụng mã hóa dữ liệu của họ trong khi lưu trữ dữ liệu đó trong kho lưu trữ dữ liệu chính.

Ưu điểm của Vault là gì?

Vault cung cấp các dịch vụ mã hóa được kiểm soát bởi các phương thức xác thực và ủy quyền . Sử dụng giao diện người dùng, CLI hoặc API HTTP của Vault, quyền truy cập vào các bí mật và dữ liệu nhạy cảm khác có thể được lưu trữ và quản lý một cách an toàn, được kiểm soát chặt chẽ (bị hạn chế) và có thể kiểm tra được.

Làm cách nào để lưu trữ bí mật trong MySQL?

Quản lý bí mật có nghĩa là xử lý tất cả các loại bí mật theo cách có cấu trúc và an toàn. .
Tạo một chính sách
Tạo một vai trò được sử dụng để xác thực
Thêm id bí mật vào vai trò
Bật và định cấu hình chương trình phụ trợ bí mật của cơ sở dữ liệu

MySQL Workbench vault ở đâu?

nó thực sự là %appdata%\MySql\Workbench\workbench_user_data .