Thứ ba, 02/04/2019 | 00:00 GMT+7

Cách kiểm tra database PostgreSQL với InSpec trên Ubuntu 18.04

InSpec là một khung kiểm tra tự động, open-souce để kiểm tra và đánh giá hệ thống của bạn nhằm đảm bảo tuân theo các yêu cầu về tích hợp, bảo mật và các yêu cầu policy khác. Các nhà phát triển có thể kiểm tra trạng thái thực tế của cơ sở hạ tầng và ứng dụng của họ so với trạng thái đích bằng cách sử dụng mã InSpec.

Để chỉ định các yêu cầu policy mà bạn đang thử nghiệm, InSpec bao gồm các kiểm soát kiểm tra . Theo truyền thống, các nhà phát triển thực thi các yêu cầu policy theo cách thủ công và thường làm điều này ngay trước khi áp dụng các thay đổi cho production . Tuy nhiên, với InSpec, các nhà phát triển có thể liên tục đánh giá sự tuân theo ở mọi giai đoạn phát triển sản phẩm, giúp giải quyết các vấn đề sớm hơn trong quá trình phát triển. InSpec DSL (Domain Specific Language) được xây dựng trên RSpec , một công cụ kiểm tra DSL được viết bằng Ruby, chỉ định cú pháp được sử dụng để viết các điều khiển kiểm tra.

InSpec cũng bao gồm một tập hợp các tài nguyên để hỗ trợ việc cấu hình các phần cụ thể trong hệ thống của bạn và để đơn giản hóa việc thực hiện các kiểm soát kiểm tra. Có một tính năng để viết tài nguyên tùy chỉnh của bạn khi bạn cần xác định một giải pháp cụ thể không có sẵn. Các trình đối sánh phổ quát cho phép bạn so sánh giá trị tài nguyên với kỳ vọng trong tất cả các thử nghiệm InSpec.

Trong hướng dẫn này, bạn sẽ cài đặt InSpec trên server chạy Ubuntu 18.04. Bạn sẽ bắt đầu bằng cách viết một bài kiểm tra xác minh họ hệ điều hành của server , sau đó bạn sẽ tạo một profile kiểm tra PostgreSQL từ đầu. Hồ sơ kiểm tra này bắt đầu bằng cách kiểm tra xem bạn đã cài đặt PostgreSQL trên server và các dịch vụ của nó đang chạy. Sau đó, bạn sẽ thêm các bài kiểm tra để kiểm tra xem dịch vụ PostgreSQL có đang chạy với đúng cổng, địa chỉ, giao thức và user hay không. Tiếp theo, bạn sẽ kiểm tra các thông số cấu hình PostgreSQL cụ thể và cuối cùng, bạn sẽ kiểm tra cấu hình xác thực client .

Yêu cầu

Trước khi làm theo hướng dẫn này, bạn cần những thứ sau:

Bước 1 - Chuẩn bị Môi trường

Trong bước này, bạn sẽ download và extract version InSpec ổn định mới nhất vào folder chính của bạn . InSpec cung cấp các file binary có thể cài đặt trên trang download của họ.

Điều hướng đến folder chính của bạn:

  • cd ~

Bây giờ download file binary với curl :

  • curl -LO https://packages.chef.io/files/stable/inspec/3.7.11/ubuntu/18.04/inspec_3.7.11-1<^>_amd64.deb

Tiếp theo, sử dụng lệnh sha256sum để tạo tổng kiểm tra của file đã download . Điều này là để xác minh tính toàn vẹn và tính xác thực của file đã download .

  • sha256sum inspec_3.7.11-1_amd64.deb

Kiểm tra cho mỗi file binary được liệt kê trên trang download InSpec , vì vậy hãy truy cập trang download để so sánh với kết quả của bạn từ lệnh này.

Output
e665948f9c0441e8648b08f8d3c8d34a86f9e994609877a7e4853c012dbc7523 inspec_3.7.11-1_amd64.deb

Nếu tổng kiểm tra khác nhau, hãy xóa file đã download và lặp lại quá trình download .

Tiếp theo, bạn sẽ cài đặt file binary đã download . Đối với điều này, bạn sẽ sử dụng lệnh dpkg mà bạn có thể sử dụng để quản lý gói và đi kèm với tất cả các hệ thống dựa trên Debian, chẳng hạn như Ubuntu, theo mặc định. Cờ -i nhắc lệnh dpkg cài đặt các file gói.

  • sudo dpkg -i inspec_3.7.11-1_amd64.deb

Nếu không có lỗi nghĩa là bạn đã cài đặt InSpec thành công. Để xác minh cài đặt, hãy nhập lệnh sau:

  • inspec version

Bạn sẽ nhận được kết quả hiển thị version InSpec mà bạn vừa cài đặt:

Output
3.7.11

Nếu bạn không thấy số version được hiển thị, hãy chạy lại bước 1.

Sau đó, bạn có thể xóa inspec_3.7.11-1_amd64.deb vì bạn không cần nó nữa vì bạn đã cài đặt gói:

  • rm inspec_3.7.11-1_amd64.deb

Bạn đã cài đặt thành công InSpec trên server của bạn . Trong bước tiếp theo, bạn sẽ viết một bài kiểm tra để xác minh họ hệ điều hành của server của bạn.

Bước 2 - Hoàn thành Kiểm tra InSpec đầu tiên của bạn

Trong bước này, bạn sẽ hoàn thành kiểm tra InSpec đầu tiên của bạn , kiểm tra này sẽ kiểm tra xem họ hệ điều hành của bạn có phải là debian .

Bạn sẽ sử dụng os tài nguyên, mà là một built-in Inspec tài nguyên kiểm toán để kiểm tra nền tảng mà trên đó hệ thống đang chạy. Bạn cũng sẽ sử dụng eq matcher. Trình so khớp eq khớp phổ quát kiểm tra sự bằng nhau chính xác của hai giá trị.

Một Inspec thử nghiệm bao gồm một describe khối, trong đó có một hoặc nhiều itits báo cáo mỗi trong số đó xác nhận một trong những tính năng của tài nguyên. Mỗi câu lệnh mô tả một kỳ vọng về một điều kiện cụ thể của hệ thống dưới dạng các khẳng định . Hai từ khóa mà bạn có thể đưa vào để đưa ra khẳng định là shouldshould_not , xác nhận điều kiện phải đúng và sai tương ứng.

Tạo một file có tên os_family.rb để giữ bài kiểm tra của bạn và mở nó bằng editor của bạn:

  • nano os_family.rb

Thêm phần sau vào file của bạn:

os_family.rb
describe os.family do   it {should eq 'debian'} end 

Kiểm tra này đảm bảo họ hệ điều hành của hệ thống đích là debian . Các giá trị có thể có khác là windows , unix , bsd , v.v. Bạn có thể tìm thấy một danh sách đầy đủ trong os tài liệu nguồn . Lưu và thoát khỏi file .

Tiếp theo, chạy thử nghiệm của bạn bằng lệnh sau:

  • inspec exec os_family.rb

Bài kiểm tra sẽ vượt qua và bạn sẽ nhận được kết quả giống như sau:

Output
Profile: tests from os_family.rb (tests from os_family.rb) Version: (not specified) Target: local:// debian ✔ should eq "debian" Test Summary: 1 successful, 0 failures, 0 skipped

Trong kết quả của bạn, Profile chứa tên của profile vừa thực thi. Vì kiểm tra này không có trong cấu hình, InSpec tạo tên cấu hình mặc định từ kiểm tra tên file của tests from os_family.rb . (Bạn sẽ làm việc với hồ sơ InSpec trong phần tiếp theo, nơi bạn sẽ bắt đầu xây dựng profile InSpec PostgreSQL của bạn .) Ở đây InSpec trình bày Version như not specified , vì bạn chỉ có thể chỉ định version trong profile .

Trường Target chỉ định hệ thống đích mà thử nghiệm được thực thi, có thể là hệ thống local hoặc hệ thống từ xa thông qua ssh . Trong trường hợp này, bạn đã thực hiện thử nghiệm của bạn trên hệ thống local để mục tiêu hiển thị local:// .

Một cách hữu ích, kết quả cũng hiển thị kiểm tra đã thực hiện với biểu tượng dấu kiểm (✔) ở bên trái cho biết kiểm tra thành công. Đầu ra sẽ hiển thị biểu tượng chữ thập (✘) nếu thử nghiệm không thành công.

Cuối cùng, bản tóm tắt thử nghiệm cung cấp chi tiết tổng thể về số lượng thử nghiệm thành công, không thành công và bị bỏ qua. Trong trường hợp này, bạn đã có một bài kiểm tra thành công.

Đến đây bạn sẽ thấy kết quả trông như thế nào cho một thử nghiệm thất bại. Mở os_family.rb :

  • nano os_family.rb

Trong thử nghiệm bạn đã tạo trước đó ở bước này, bây giờ bạn sẽ thay đổi giá trị mong đợi của họ hệ điều hành từ debian sang windows . Nội dung file của bạn sau đó sẽ như sau:

os_family.rb
describe os.family do   it {should eq 'windows'} end 

Lưu và thoát khỏi file .

Tiếp theo, chạy thử nghiệm đã cập nhật bằng lệnh sau:

  • inspec exec os_family.rb

Bạn sẽ nhận được kết quả tương tự như sau:

Output
Profile: tests from os_family.fail.rb (tests from os_family.fail.rb) Version: (not specified) Target: local:// debian (✘) should eq "windows" expected: "windows" got: "debian" (compared using ==) Test Summary: 0 successful, 1 failure, 0 skipped

Quả nhiên, cuộc thử nghiệm không thành công. Kết quả kết quả cho biết các giá trị thực tế ( windows ) và thực tế ( debian ) của bạn không trùng với thuộc tính os.family . Đầu ra (compared using ==) cho biết trình so khớp eq đã thực hiện so sánh chuỗi giữa hai giá trị để đưa ra kết quả này.

Trong bước này, bạn đã viết một bài kiểm tra thành công xác minh họ hệ điều hành của server . Bạn cũng đã tạo một bài kiểm tra không thành công để xem kết quả InSpec cho một bài kiểm tra không thành công trông như thế nào. Trong bước tiếp theo, bạn sẽ bắt đầu xây dựng profile kiểm toán để kiểm tra cài đặt PostgreSQL của bạn .

Bước 3 - Kiểm tra cài đặt PostgreSQL của bạn

Bây giờ, bạn sẽ kiểm tra cài đặt PostgreSQL của bạn . Bạn sẽ bắt đầu bằng cách kiểm tra xem bạn đã cài đặt PostgreSQL chưa và dịch vụ của nó đang chạy chính xác. Cuối cùng, bạn sẽ kiểm tra quá trình và cổng hệ thống PostgreSQL. Để kiểm tra PostgreSQL của bạn, bạn sẽ tạo các điều khiển InSpec khác nhau, tất cả đều nằm trong một profile InSpec có tên PostgreSQL .

Điều khiển InSpec là một group cấp cao của các thử nghiệm liên quan. Trong một điều khiển, bạn có thể có nhiều khối describe , cũng như metadata để mô tả các thử nghiệm của bạn như mức độ tác động, tiêu đề, mô tả và thẻ. Cấu hình InSpec tổ chức các điều khiển để hỗ trợ quản lý phụ thuộc và tái sử dụng mã, cả hai đều giúp quản lý độ phức tạp của thử nghiệm. Chúng cũng hữu ích cho việc đóng gói và chia sẻ các bài kiểm tra với công chúng qua Siêu thị đầu bếp . Bạn có thể sử dụng các cấu hình để xác định các tài nguyên tùy chỉnh mà bạn sẽ triển khai như các lớp Ruby thông thường.

Để tạo profile InSpec, bạn sẽ sử dụng lệnh init . Nhập lệnh này để tạo profile PostgreSQL :

  • inspec init profile PostgreSQL

Điều này tạo profile trong một folder mới có cùng tên với profile của bạn, trong trường hợp này là PostgreSQL . Bây giờ, hãy chuyển sang folder mới:

  • cd PostgreSQL/

Cấu trúc folder sẽ như thế này:

PostgreSQL/ ├── controls │   └── example.rb ├── inspec.yml ├── libraries └── README.md 

Tệp controls/example.rb chứa điều khiển mẫu kiểm tra xem folder /tmp có tồn tại trên hệ thống đích hay không. Đây chỉ là một mẫu và bạn sẽ thay thế nó bằng bài kiểm tra của bạn .

Thử nghiệm đầu tiên của bạn sẽ là đảm bảo bạn đã cài đặt gói postgresql-10 trên hệ thống của bạn và bạn đã cài đặt, kích hoạt và chạy dịch vụ postgresql .

Đổi tên file controls/example.rb thành controls/postgresql.rb :

  • mv controls/example.rb controls/postgresql.rb

Tiếp theo, mở file bằng editor của bạn:

  • nano controls/postgresql.rb

Thay thế nội dung của file bằng nội dung sau:

control / postgresql.rb
control '1-audit_installation' do   impact 1.0   title 'Audit PostgreSQL Installation'   desc 'Postgres should be installed and running'    describe package('postgresql-10') do     it {should be_installed}     its('version') {should cmp >= '10'}   end    describe service('postgresql@10-main') do     it {should be_enabled}     it {should be_installed}     it {should be_running}   end end 

Trong khối mã trước đó, bạn bắt đầu bằng cách xác định điều khiển với tên và metadata của nó.

Trong khối describe đầu tiên, bạn sử dụng tài nguyên package và chuyển vào tên gói PostgreSQL postgresql-10 làm đối số tài nguyên. Tài nguyên package cung cấp trình kết hợp be_installed để kiểm tra xem gói có tên đã được cài đặt trên hệ thống hay chưa. Nó trả về true nếu bạn đã cài đặt gói và false nếu không. Tiếp theo, bạn đã sử dụng câu lệnh its để xác thực rằng version của gói PostgreSQL đã cài đặt ít nhất là 10. Bạn đang sử dụng cmp thay vì eq vì các chuỗi version gói thường chứa các thuộc tính khác ngoài version số. eq trả về true nếu có kết quả khớp chính xác trong khi cmp ít hạn chế hơn.

Trong khối describe thứ hai, bạn sử dụng tài nguyên service và chuyển vào tên dịch vụ PostgreSQL 10 postgresql@10-main làm đối số tài nguyên. Tài nguyên service cung cấp các đối be_enabled , be_installedbe_running và chúng trả về true nếu bạn đã cài đặt, kích hoạt và chạy dịch vụ được đặt tên tương ứng trên hệ thống đích.

Lưu và thoát khỏi file của bạn.

Tiếp theo, bạn sẽ chạy profile của bạn . Đảm bảo rằng bạn đang ở trong folder ~/PostgreSQL trước khi chạy lệnh sau:

  • inspec exec .

Vì bạn đã hoàn thành hướng dẫn yêu cầu PostgreSQL, nên bài kiểm tra của bạn sẽ vượt qua. Đầu ra của bạn sẽ trông giống như sau:

Output
Profile: InSpec Profile (PostgreSQL) Version: 0.1.0 Target: local:// ✔ 1-audit_installation: Audit PostgreSQL Installation ✔ System Package postgresql-10 should be installed ✔ System Package postgresql-10 version should cmp >= "10" ✔ Service postgresql@10-main should be enabled ✔ Service postgresql@10-main should be installed ✔ Service postgresql@10-main should be running Profile Summary: 1 successful control, 0 control failures, 0 controls skipped Test Summary: 5 successful, 0 failures, 0 skipped

Đầu ra cho biết rằng điều khiển của bạn đã thành công. Điều khiển thành công nếu và chỉ khi, tất cả các thử nghiệm trong đó thành công. Kết quả kết quả cũng xác nhận tất cả các thử nghiệm của bạn đã thành công.

Đến đây bạn đã xác minh version PostgreSQL chính xác được cài đặt và dịch vụ tốt, bạn sẽ tạo một điều khiển mới đảm bảo rằng PostgreSQL đang lắng nghe trên đúng cổng, địa chỉ và giao thức.

Đối với bài kiểm tra này, bạn cũng sẽ sử dụng các thuộc tính . Thuộc tính InSpec được sử dụng để tham số hóa một cấu hình nhằm cho phép dễ dàng sử dụng lại trong các môi trường hoặc hệ thống đích khác nhau. Bạn sẽ xác định thuộc tính PORT .

Mở inspec.yml file trong editor của bạn:

  • nano inspec.yml

Bạn sẽ nối thuộc tính port vào cuối file . Thêm phần sau vào cuối file của bạn:

Examec.yml
... attributes:   - name: port     type: string     default: '5432' 

Trong khối mã trước đó, bạn đã thêm thuộc tính port và đặt nó thành giá trị mặc định là 5432 vì đó là cổng mà PostgreSQL lắng nghe theo mặc định.

Lưu và thoát khỏi file . Sau đó, chạy inspec check để xác minh profile vẫn còn hợp lệ vì bạn vừa mới chỉnh sửa inspec.yml :

  • inspec check .

Nếu không có lỗi, bạn có thể tiến hành. Nếu không, hãy mở file inspec.yml và đảm bảo thuộc tính có ở cuối file .

Đến đây bạn sẽ tạo điều khiển để kiểm tra xem quá trình PostgreSQL có đang chạy và được cấu hình với đúng user hay không. Mở controls/postgresql.rb trong editor của bạn:

  • nano controls/postgresql.rb

Nối điều khiển sau vào cuối các controls/postgresql.rb file kiểm tra hiện tại của bạn controls/postgresql.rb :

control / postgresql.rb
... PORT = attribute('port')  control '2-audit_address_port' do   impact 1.0   title 'Audit Process and Port'   desc 'Postgres port should be listening and the process should be running'    describe port(PORT) do     it {should be_listening}     its('addresses') {should include '127.0.0.1'}     its('protocols') {should cmp 'tcp'}   end    describe processes('postgres') do     it {should exist}     its('users') {should include 'postgres'}   end    describe user('postgres') do     it {should exist}   end end 

Ở đây, bạn bắt đầu bằng cách khai báo một biến PORT để giữ giá trị của thuộc tính cấu hình port . Sau đó, bạn khai báo điều khiển và metadata của nó.

Trong khối describe đầu tiên, bạn bao gồm tài nguyên port để kiểm tra các thuộc tính cơ bản của cổng. Tài nguyên port cung cấp các đối be_listening , addressesprotocols . Bạn sử dụng trình be_listening khớp be_listening để kiểm tra xem cổng được đặt tên có đang lắng nghe trên hệ thống đích hay không. Nó trả về true nếu cổng 5432 đang lắng nghe và trả về false nếu ngược lại. Trình so khớp addresses kiểm tra xem địa chỉ được chỉ định có được liên kết với cổng hay không. Trong trường hợp này, PostgreSQL sẽ lắng nghe địa chỉ local , 127.0.0.1 .
Trình so khớp protocols kiểm tra giao thức Internet mà cổng đang lắng nghe, có thể là icmp , tcp / tcp6 hoặc udp / udp6 . PostgreSQL sẽ lắng nghe các kết nối tcp .

Trong khối describe thứ hai, bạn bao gồm tài nguyên processes . Bạn sử dụng tài nguyên processes để kiểm tra các thuộc tính cho các chương trình đang chạy trên hệ thống. Đầu tiên, bạn xác minh quá trình postgres tồn tại trên hệ thống, sau đó bạn sử dụng trình khớp users để kiểm tra xem user postgres sở hữu quy trình postgres .

Trong khối describe thứ ba, bạn có tài nguyên user . Bạn bao gồm tài nguyên user để kiểm tra các thuộc tính user cho một user , chẳng hạn như user đó có tồn tại hay không, group user thuộc về, v.v. Sử dụng tài nguyên này, bạn kiểm tra xem user postgres có tồn tại trên hệ thống hay không. Lưu và thoát controls/postgresql.rb .

Tiếp theo, chạy profile của bạn bằng lệnh sau:

  • inspec exec .

Các bài kiểm tra sẽ vượt qua và kết quả của bạn sẽ giống như sau:

Output
Profile: InSpec Profile (PostgreSQL) Version: 0.1.0 Target: local:// ✔ 1-audit_installation: Audit PostgreSQL Installation ✔ System Package postgresql-10 should be installed ✔ System Package postgresql-10 version should cmp >= "10" ✔ Service postgresql@10-main should be enabled ✔ Service postgresql@10-main should be installed ✔ Service postgresql@10-main should be running ✔ 2-audit_address_port: Audit Process and Port ✔ Port 5432 should be listening ✔ Port 5432 addresses should include "127.0.0.1" ✔ Port 5432 protocols should cmp == "tcp" ✔ Processes postgres should exist ✔ Processes postgres users should include "postgres" ✔ User postgres should exist Profile Summary: 2 successful controls, 0 control failures, 0 controls skipped Test Summary: 11 successful, 0 failures, 0 skipped

Kết quả kết quả cho biết rằng cả hai điều khiển của bạn và tất cả các thử nghiệm của bạn đều thành công.

Trong phần này, bạn đã tạo profile và kiểm soát InSpec đầu tiên của bạn và sử dụng chúng để tổ chức các thử nghiệm của bạn. Bạn đã sử dụng một số tài nguyên InSpec đảm bảo rằng bạn đã cài đặt đúng version PostgreSQL, dịch vụ PostgreSQL được kích hoạt và chạy chính xác cũng như user PostgreSQL tồn tại trên hệ thống. Với cài đặt này, bạn đã sẵn sàng để kiểm tra cấu hình của bạn .

Bước 4 - Kiểm tra cấu hình PostgreSQL của bạn

Trong bước này, bạn sẽ kiểm tra một số giá trị cấu hình PostgreSQL, điều này sẽ cung cấp cho bạn nền tảng để làm việc với các file cấu hình này, cho phép bạn kiểm tra mọi thông số cấu hình PostgreSQL như mong muốn.

Đến đây bạn có các bài kiểm tra kiểm tra cài đặt PostgreSQL, bạn sẽ kiểm tra chính cấu hình PostgreSQL của bạn . PostgreSQL có một số thông số cấu hình mà bạn có thể sử dụng để điều chỉnh nó như mong muốn và chúng được lưu trữ trong file cấu hình theo mặc định tại /etc/postgresql/10/main/postgresql.conf . Bạn có thể có các yêu cầu khác nhau liên quan đến cấu hình PostgreSQL cho các triển khai khác nhau của bạn như ghi log , mã hóa password , SSL và chiến lược sao chép - những yêu cầu này bạn chỉ định trong file cấu hình.

Bạn sẽ sử dụng tài nguyên postgres_conf để kiểm tra các tùy chọn cấu hình cụ thể, được đặt tên dựa trên các giá trị mong đợi trong nội dung của file cấu hình PostgreSQL.

Kiểm tra này sẽ giả định một số giá trị cấu hình PostgreSQL không mặc định mà bạn sẽ đặt theo cách thủ công.

Mở file cấu hình PostgreSQL trong editor yêu thích của bạn:

  • sudo nano /etc/postgresql/10/main/postgresql.conf

Đặt các giá trị cấu hình sau. Nếu tùy chọn đã tồn tại trong file nhưng được comment ra ngoài, hãy bỏ ghi chú bằng cách xóa dấu # và đặt giá trị như được cung cấp:

/etc/postgresql/10/main/postgresql.conf
password_encryption = scram-sha-256 logging_collector = on log_connections = on log_disconnections = on log_duration = on 

Các giá trị cấu hình bạn đã đặt:

  • Đảm bảo rằng password đã lưu luôn được mã hóa bằng thuật toán scram-sha-256.
  • Kích hoạt trình logging collector , đây là một quy trình ghi lại các thông báo log từ lỗi chuẩn ( stderr ) và chuyển hướng chúng đến một file log .
  • Bật ghi log các lần kết nối đến server PostgreSQL cũng như các kết nối thành công.
  • Bật ghi log các kết thúc phiên.
  • Cho phép ghi lại thời lượng của mọi câu lệnh đã hoàn thành.

Lưu và thoát khỏi file cấu hình. Sau đó khởi động lại dịch vụ PostgreSQL:

  • sudo service postgresql@10-main restart

Bạn sẽ chỉ kiểm tra một số tùy chọn cấu hình, nhưng bạn có thể kiểm tra bất kỳ tùy chọn cấu hình PostgreSQL nào bằng tài nguyên postgres_conf .

Bạn sẽ chuyển vào folder cấu hình PostgreSQL của bạn , tại /etc/postgresql/10/main , sử dụng thuộc tính profile mới, postgres_conf_dir . Thư mục cấu hình này không giống nhau trên tất cả các hệ điều hành và nền tảng, vì vậy bằng cách chuyển nó vào dưới dạng thuộc tính cấu hình, bạn sẽ làm cho cấu hình này dễ sử dụng lại trong các môi trường khác nhau.

Mở file inspec.yml của bạn:

  • nano inspec.yml

Thêm thuộc tính mới này vào phần attributes của inspec.yml :

Examec.yml
...   - name: postgres_conf_dir     type: string     default: '/etc/postgresql/10/main' 

Lưu và thoát khỏi file của bạn. Sau đó, chạy lệnh sau để xác minh profile InSpec vẫn còn hợp lệ vì bạn vừa chỉnh sửa inspec.yml :

  • inspec check .

Nếu không có lỗi, bạn có thể tiến hành. Nếu không, hãy mở file inspec.yml và đảm bảo các dòng trên có ở cuối file .

Đến đây bạn sẽ tạo điều khiển kiểm tra các giá trị cấu hình mà bạn đang thực thi. Nối điều khiển sau vào cuối các controls/postgresql.rb file kiểm tra controls/postgresql.rb :

control / postgresql.rb
... POSTGRES_CONF_DIR = attribute('postgres_conf_dir') POSTGRES_CONF_PATH = File.join(POSTGRES_CONF_DIR, 'postgresql.conf')  control '3-postgresql' do   impact 1.0   title 'Audit PostgreSQL Configuration'   desc 'Audits specific configuration options'    describe postgres_conf(POSTGRES_CONF_PATH) do     its('port') {should eq PORT}     its('password_encryption') {should eq 'scram-sha-256'}     its('ssl') {should eq 'on'}     its('logging_collector') {should eq 'on'}     its('log_connections') {should eq 'on'}     its('log_disconnections') {should eq 'on'}     its('log_duration') {should eq 'on'}   end end 

Ở đây bạn xác định hai biến:

  • POSTGRES_CONF_DIR giữ thuộc tính postgres_conf_dir như được xác định trong cấu hình profile .
  • POSTGRES_CONF_PATH giữ đường dẫn tuyệt đối của file cấu hình bằng cách nối tên file cấu hình với folder cấu hình bằng File.join .

Tiếp theo, bạn xác định điều khiển bằng tên và metadata của nó. Sau đó, bạn sử dụng tài nguyên postgres_conf cùng với eq matcher đảm bảo các giá trị yêu cầu của bạn cho các tùy chọn cấu hình là chính xác. Lưu và thoát controls/postgresql.rb .

Tiếp theo, bạn sẽ chạy thử nghiệm với lệnh sau:

  • inspec exec .

Các bài kiểm tra sẽ vượt qua và kết quả kết quả của bạn sẽ giống như sau:

Output
Profile: InSpec Profile (PostgreSQL) Version: 0.1.0 Target: local:// ✔ 1-audit_installation: Audit PostgreSQL Installation ✔ System Package postgresql-10 should be installed ✔ System Package postgresql-10 version should cmp >= "10" ✔ Service postgresql@10-main should be enabled ✔ Service postgresql@10-main should be installed ✔ Service postgresql@10-main should be running ✔ 2-audit_address_port: Audit Process and Port ✔ Port 5432 should be listening ✔ Port 5432 addresses should include "127.0.0.1" ✔ Port 5432 protocols should cmp == "tcp" ✔ Processes postgres should exist ✔ Processes postgres users should include "postgres" ✔ User postgres should exist ✔ 3-postgresql: Audit PostgreSQL Configuration ✔ PostgreSQL Configuration port should eq "5432" ✔ PostgreSQL Configuration password_encryption should eq "scram-sha-256" ✔ PostgreSQL Configuration ssl should eq "on" ✔ PostgreSQL Configuration logging_collector should eq "on" ✔ PostgreSQL Configuration log_connections should eq "on" ✔ PostgreSQL Configuration log_disconnections should eq "on" ✔ PostgreSQL Configuration log_duration should eq "on" Profile Summary: 3 successful controls, 0 control failures, 0 controls skipped Test Summary: 18 successful, 0 failures, 0 skipped

Kết quả kết quả cho biết ba điều khiển của bạn và tất cả các thử nghiệm của bạn đều thành công mà không có bất kỳ thử nghiệm hoặc điều khiển nào bị bỏ qua.

Trong bước này, bạn đã thêm một điều khiển InSpec mới để kiểm tra các giá trị cấu hình PostgreSQL cụ thể từ file cấu hình bằng cách sử dụng tài nguyên postgres_conf . Bạn đã kiểm tra một vài giá trị trong phần này, nhưng bạn có thể sử dụng nó để kiểm tra bất kỳ tùy chọn cấu hình nào từ file cấu hình.

Bước 5 - Kiểm tra xác thực ứng dụng client PostgreSQL

Đến đây bạn đã viết một số thử nghiệm cho cấu hình PostgreSQL của bạn , bạn sẽ viết một số thử nghiệm để xác thực ứng dụng client . Điều này quan trọng đối với các cài đặt cần đảm bảo các phương pháp xác thực cụ thể cho các loại user khác nhau; ví dụ: đảm bảo các client kết nối local với PostgreSQL luôn cần xác thực bằng password hoặc từ chối các kết nối từ một địa chỉ IP cụ thể hoặc dải địa chỉ IP, v.v.

Một cấu hình quan trọng cho các cài đặt PostgreSQL mà vấn đề bảo mật là mối quan tâm chỉ cho phép xác thực password được mã hóa. PostgreSQL 10 hỗ trợ hai phương pháp mã hóa password để xác thực client : md5scram-sha-256 . Thử nghiệm này sẽ yêu cầu mã hóa password cho tất cả các client , vì vậy điều này nghĩa là trường METHOD cho tất cả các client trong file cấu hình client phải được đặt thành md5 hoặc scram-sha-256 . Đối với các thử nghiệm này, bạn sẽ sử dụng scram-sha-256 vì nó an toàn hơn md5 .

Theo mặc định, local client local có phương thức xác thực peer trong file pg_hba.conf . Đối với bài kiểm tra, bạn cần thay đổi chúng thành scram-sha-256 . Mở file /etc/postgresql/10/main/pg_hba.conf :

  • sudo nano /etc/postgresql/10/main/pg_hba.conf

Phần đầu của file chứa các comment . Cuộn xuống và tìm các dòng không có chú thích trong đó loại xác thực là local và thay đổi phương thức xác thực từ peer thành scram-sha-256 . Ví dụ, thay đổi:

/etc/postgresql/10/main/pg_hba.conf
... local   all             postgres                                peer ... 

đến:

/etc/postgresql/10/main/pg_hba.conf
... local   all             postgres                                scram-sha-256 ... 

Cuối cùng, cấu hình pg_hba.conf của bạn sẽ giống như sau:

/etc/postgresql/10/main/pg_hba.conf
... local   all             postgres                                scram-sha-256  # TYPE  DATABASE        USER            ADDRESS                 METHOD  # "local" is for Unix domain socket connections only local   all             all                                     scram-sha-256 # IPv4 local connections: host    all             all             127.0.0.1/32            scram-sha-256 # IPv6 local connections: host    all             all             ::1/128                 scram-sha-256 # Allow replication connections from localhost, by a user with the # replication privilege. local   replication     all                                     scram-sha-256 host    replication     all             127.0.0.1/32            scram-sha-256 host    replication     all             ::1/128                 scram-sha-256 ... 

Lưu và thoát khỏi file cấu hình. Sau đó khởi động lại dịch vụ PostgreSQL:

  • sudo service postgresql@10-main restart

Đối với bài kiểm tra này, bạn sẽ sử dụng tài nguyên postgres_hba_conf . Tài nguyên này được sử dụng để kiểm tra dữ liệu xác thực client được xác định trong file pg_hba.conf . Bạn sẽ chuyển vào đường dẫn của file pg_hba.conf của bạn dưới dạng tham số cho tài nguyên này.

Điều khiển của bạn sẽ bao gồm hai khối describe kiểm tra các trường auth_method tương ứng cho cả host khách localhost đảm bảo rằng chúng đều bằng scram-sha-256 . Mở controls/postgresql.rb trong editor của bạn:

  • nano controls/postgresql.rb

Nối điều khiển sau vào cuối controls/postgresql.rb file thử nghiệm controls/postgresql.rb :

control / postgresql.rb
POSTGRES_HBA_CONF_FILE = File.join(POSTGRES_CONF_DIR, 'pg_hba.conf')  control '4-postgres_hba' do   impact 1.0   title 'Require SCRAM-SHA-256 for ALL users, peers in pg_hba.conf'   desc 'Require SCRAM-SHA-256 for ALL users, peers in pg_hba.conf. Do not allow untrusted authentication methods.'    describe postgres_hba_conf(POSTGRES_HBA_CONF_FILE).where { type == 'local' } do     its('auth_method') { should all eq 'scram-sha-256' }   end    describe postgres_hba_conf(POSTGRES_HBA_CONF_FILE).where { type == 'host' } do     its('auth_method') { should all eq 'scram-sha-256' }   end end 

Trong khối mã này, bạn xác định một biến mới POSTGRES_HBA_CONF_FILE để lưu trữ vị trí tuyệt đối của file pg_hba.conf của bạn. File.join là một phương thức Ruby để nối hai đoạn đường dẫn file với / . Bạn sử dụng nó ở đây để nối biến POSTGRES_CONF_DIR , được khai báo ở phần trước, với file cấu hình PostgreSQL pg_hba.conf . Điều này sẽ tạo ra một đường dẫn file tuyệt đối của file pg_hba.conf và lưu trữ nó trong biến POSTGRES_HBA_CONF_FILE .

Sau đó, bạn khai báo và cấu hình điều khiển và metadata của nó. Khối describe đầu tiên kiểm tra xem tất cả các mục nhập cấu hình trong đó loại client là local cũng có scram-sha-256 làm phương thức xác thực của chúng. Khối describe thứ hai thực hiện tương tự đối với các trường hợp loại client là host . Lưu và thoát controls/postgresql.rb .

Bạn sẽ thực thi điều khiển này với quyền là user postgres vì quyền truy cập Read vào cấu hình PostgreSQL HBA chỉ được cấp cho Chủ sở hữu và Group , là user postgres . Thực thi cấu hình bằng lệnh:

  • sudo -u postgres inspec exec .

Đầu ra của bạn sẽ giống như sau:

Output
Profile: InSpec Profile (PostgreSQL) Version: 0.1.0 Target: local:// ✔ 1-audit_installation: Audit PostgreSQL Installation ✔ System Package postgresql-10 should be installed ✔ System Package postgresql-10 version should cmp >= "10" ✔ Service postgresql@10-main should be enabled ✔ Service postgresql@10-main should be installed ✔ Service postgresql@10-main should be running ✔ 2-audit_address_port: Audit Process and Port ✔ Port 5432 should be listening ✔ Port 5432 addresses should include "127.0.0.1" ✔ Port 5432 protocols should cmp == "tcp" ✔ Processes postgres should exist ✔ Processes postgres users should include "postgres" ✔ User postgres should exist ✔ 3-postgresql: Audit PostgreSQL Configuration ✔ PostgreSQL Configuration port should eq "5432" ✔ PostgreSQL Configuration password_encryption should eq "scram-sha-256" ✔ PostgreSQL Configuration ssl should eq "on" ✔ PostgreSQL Configuration logging_collector should eq "on" ✔ PostgreSQL Configuration log_connections should eq "on" ✔ PostgreSQL Configuration log_disconnections should eq "on" ✔ PostgreSQL Configuration log_duration should eq "on" ✔ 4-postgres_hba: Require SCRAM-SHA-256 for ALL users, peers in pg_hba.conf ✔ Postgres Hba Config /etc/postgresql/10/main/pg_hba.conf with type == "local" auth_method should all eq "scram-sha-256" ✔ Postgres Hba Config /etc/postgresql/10/main/pg_hba.conf with type == "host" auth_method should all eq "scram-sha-256" Profile Summary: 4 successful controls, 0 control failures, 0 controls skipped Test Summary: 20 successful, 0 failures, 0 skipped

Đầu ra này cho biết rằng điều khiển mới bạn đã thêm, cùng với tất cả các điều khiển trước đó, đã thành công. Nó cũng cho biết tất cả các thử nghiệm trong profile của bạn đều thành công.

Trong bước này, bạn đã thêm một điều khiển vào profile của bạn để kiểm tra thành công cấu hình xác thực client PostgreSQL của bạn đảm bảo rằng tất cả các client đều được xác thực qua scram-sha-256 bằng cách sử dụng tài nguyên postgres_hba_conf .

Kết luận

Bạn đã cài đặt InSpec và kiểm tra thành công cài đặt PostgreSQL 10. Trong quá trình này, bạn đã sử dụng một loạt các công cụ InSpec, chẳng hạn như: InSpec DSL, đối sánh, tài nguyên, profile , thuộc tính và CLI. Từ đây, bạn có thể kết hợp các tài nguyên khác mà InSpec cung cấp trong phần Tài nguyên trong tài liệu của họ. InSpec cũng cung cấp cơ chế xác định tài nguyên tùy chỉnh cho các nhu cầu cụ thể của bạn. Các tài nguyên tùy chỉnh này được viết như một lớp Ruby thông thường.

Bạn cũng có thể khám phá phần Compliance Profiles của siêu thị Chef có chứa các profile InSpec được chia sẻ công khai mà bạn có thể thực thi trực tiếp hoặc mở rộng trong profile của riêng mình. Bạn cũng có thể chia sẻ profile của riêng mình với công chúng trong Siêu thị đầu bếp.

Bạn có thể đi xa hơn bằng cách khám phá các công cụ khác trong vũ trụ Chef như ChefHabitat . InSpec được tích hợp với Habitat và điều này cung cấp khả năng gửi các biện pháp kiểm soát tuân theo của bạn cùng với các ứng dụng đóng gói Habitat của bạn và liên tục chạy chúng. Bạn có thể khám phá các hướng dẫn InSpec chính thức và cộng đồng trên trang hướng dẫn . Để biết thêm các tài liệu tham khảo InSpec nâng cao, hãy xem tài liệu InSpec chính thức.


Tags:

Các tin liên quan

Công cụ kết nối dịch vụ database và đo điểm chuẩn PostgreSQL bằng pgbench
2019-02-14
Giới thiệu về Truy vấn trong PostgreSQL
2018-10-17
Cách thiết lập bản sao lôgic với PostgreSQL 10 trên Ubuntu 18.04
2018-08-31
Cách di chuyển thư mục dữ liệu PostgreSQL đến vị trí mới trên Ubuntu 18.04
2018-07-13
Cách cài đặt và sử dụng PostgreSQL trên Ubuntu 18.04
2018-05-04
Cách sử dụng tìm kiếm toàn văn bản trong PostgreSQL trên Ubuntu 16.04
2017-06-15
Cách bảo mật PostgreSQL chống lại các cuộc tấn công tự động
2017-01-24
Cách sử dụng Postgresql với Ứng dụng Django của bạn trên Debian 8
2016-12-22
Cách di chuyển thư mục dữ liệu PostgreSQL đến vị trí mới trên Ubuntu 16.04
2016-07-27
Cách sử dụng PostgreSQL với Ứng dụng Django của bạn trên Ubuntu 16.04
2016-05-18