Operations Security

Hướng dẫn sử dụng GPG để mã hóa và ký thông điệp

CyStack Avatar

Trung Nguyen

CEO @CyStack|September 20, 2023


GPG, hoặc GNU Privacy Guard, là một ứng dụng mã hóa khoá công khai, cho phép truyền tải thông tin giữa các bên an toàn và có thể được sử dụng để xác minh nguồn gốc của một thông điệp là chính chủ hay không. Trong hướng dẫn này, hãy cùng thảo luận GPG hoạt động như thế nào và cách sử dụng GPG. CyStack sẽ sử dụng máy chủ hệ điều hành Ubuntu 16.04 để thực hiện thử nghiệm này, đồng thời đưa ra các hướng dẫn cho các hệ điều hành khác.

Cách thức làm việc của khóa công khai mã hóa (Public Key Encryption)

Một vấn đề mà nhiều người dùng phải đối mặt là làm thế nào để giao tiếp an toàn và xác nhận danh tính của người mà họ đang nói chuyện. Nhiều nỗ lực để giải quyết câu hỏi này đã được đưa ra nhằm chuyển giao mật khẩu hoặc các chứng nhận xác thực khác qua một môi trường mà chúng ta nghi ngờ là không được an toàn cho lắm.

Đảm bảo rằng chỉ có người dùng được chỉ định mới ​​có thể đọc

Để giải quyết vấn đề này, GPG dựa vào một khái niệm bảo mật được gọi là mã hóa khóa công khai. Ý tưởng là bạn có thể phân chia các giai đoạn mã hoá và giải mã của việc truyền tin thành hai phần riêng biệt. Bằng cách đó, bạn có thể tự do phân phối/gửi đi phần mã hóa, miễn là bạn đảm bảo bảo mật phần giải mã.

Tóm tắt quá trình trao đổi thông tin sử dụng mã hóa khóa công khai
Tóm tắt quá trình trao đổi thông tin sử dụng mã hóa khóa công khai

Điều này sẽ cho phép truyền một chiều có thể được tạo và mã hóa bởi bất kỳ ai, nhưng chỉ được giải mã bởi người dùng được chỉ định (người có khoá giải mã riêng). Nếu cả hai bên tạo cặp khóa công khai hoặc khóa riêng và cung cấp cho nhau khóa mã hoá công khai của họ, họ có thể mã hóa thông điệp cho nhau.
Vì vậy, trong trường hợp này, mỗi bên đều có khóa cá nhân riêng và khoá công khai của người dùng khác.

Xác nhận tính xác thực của người gửi

Một lợi ích khác của hệ thống này là người gửi thông điệp có thể “ký” thông điệp bằng khóa cá nhân của họ. Khóa công khai mà người nhận có thể dùng để xác minh được rằng chữ ký đó thực sự đã được gửi bởi người dùng chỉ định.

>> Tìm hiểu thêm: Dịch vụ Pentest của CyStack

Thiết lập khóa GPG

GPG được cài đặt mặc định trong hầu hết các hệ điều hành.
Nếu vì lý do nào đó mà GPG không được cài đặt trên Ubuntu và Debian, bạn có thể cập nhật các chỉ mục local repo trên máy và cài đặt nó bằng cách gõ:

$ sudo apt-get update
$ sudo apt-get install gnupg

Trên CentOS, bạn có thể thiết lập GPG bằng cách gõ:

$ sudo yum install gnupg2

Để bắt đầu sử dụng GPG để mã hóa các thông tin liên lạc của bạn, bạn cần phải tạo một cặp khóa. Bạn có thể làm điều này bằng cách phát hành lệnh sau:

$ gpg --gen-key

Đến đây, có thể bạn sẽ gặp một vài câu hỏi như sau:

  • Vui lòng chọn loại khoá bạn muốn (Please select what kind of key you want): (1) RSA và RSA (default)
  • Bạn muốn mã gì? (What keysize do you want?) : 4096
  • Khóa có hợp lệ không? (Key is valid for?) :1y  (hết hạn sau 1 năm. Nếu bạn đang thử nghiệm, bạn có thể tạo một khoá ngắn ngay từ lần đầu tiên bằng cách sử dụng một số như “3” thay thế.)
  • Đây có phải là đúng? (Is this correct?): y
  • Tên thật (Real name): tên thật của bạn ở đây
  • Email Address: youremail@address.com
  • Bình luận (Comment): Bình luận tùy chọn này sẽ được hiển thị trong chữ ký của bạn
  • Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?: O
  • Nhập cụm từ mật khẩu: Nhập cụm mật khẩu bảo mật ở đây (chữ viết thường, chữ số, ký hiệu)

Tại thời điểm này, GPG sẽ tạo ra các phím bằng cách sử dụng Entropy. Entropy  mô tả số lượng định tính mức độ không thể đoán trước và không xác định được tồn tại trong một hệ thống. GPG cần Entropy này để tạo ra một bộ khóa an toàn.
Quá trình này có thể mất một thời gian dài tùy thuộc vào mức độ hoạt động của hệ thống và khóa bạn chọn. Để tạo Entropy bổ sung dễ dàng hơn, bạn có thể sử dụng một công cụ gọi là haveged. Mở một thiết bị đầu cuối mới và SSH vào máy chủ một lần nữa để cài đặt haveged vào máy chủ của bạn.

Tạo Chứng chỉ Thu hồi

Bạn cần phải có một cách để làm mất hiệu lực cặp khóa của bạn trong trường hợp có vi phạm bảo mật hoặc trong trường hợp bạn bị mất khóa bí mật. Có một cách dễ dàng để làm điều này với phần mềm GPG.
Điều này nên được thực hiện ngay khi bạn thực hiện đặt cặp khóa, không phải khi bạn cần nó. Khóa thu hồi này phải được tạo ra trước thời hạn và được lưu giữ ở một vị trí an toàn, riêng biệt trong trường hợp máy tính của bạn bị xâm nhập hoặc không hoạt động. Để tạo khóa thu hồi, hãy nhập:

$ gpg --output ~/revocation.crt --gen-revoke your_email@address.com

Bạn sẽ được yêu cầu xác nhận việc tạo khoá thu hồi và sau đó được nhắc đưa ra lý do nó đang bị thu hồi. Thông tin này sẽ được hiển thị cho những người dùng khác nếu việc thu hồi được sử dụng trong tương lai. Bạn có thể chọn bất kỳ lựa chọn nào có sẵn, nhưng vì điều này được thực hiện trước khi diễn ra, bạn sẽ không có những chi tiết cụ thể. Thông thường, bạn nên tạo một giấy chứng nhận thu hồi cho từng tình huống có khả năng linh hoạt tối đa.
Sau đó, bạn sẽ được yêu cầu cung cấp một nhận xét và để xác nhận các lựa chọn cuối cùng. Trước khi tạo chứng chỉ thu hồi, bạn cần phải nhập cụm mật khẩu của khóa GPG để xác nhận danh tính của mình. Giấy chứng nhận thu hồi sẽ được ghi vào tệp được chỉ định bởi cờ –output ((revocation.crt trong ví dụ sau):

Output
Revocation certificate created.
Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable.  But have some caution:  The print system of
your machine might store the data and make it available to others!

(Chứng chỉ thu hồi đã được tạo.
Hãy di chuyển nó đến một môi trường mà bạn có thể ẩn đi; nếu Mallory  có thể truy cập vào chứng chỉ này ông ta có thể sử dụng nó để làm cho khóa của bạn không sử dụng được. Bạn nên in giấy chứng nhận này và cất giữ nó, chỉ trong trường hợp thiết bị của bạn không thể đọc được. Nhưng hãy cẩn thận: Hệ thống in máy tính của bạn có thể lưu trữ dữ liệu và người khác có thể đọc được!)

Bạn nên ngay lập tức hạn chế quyền truy cập vào tệp tin chứng chỉ được tạo ra để ngăn chặn truy cập trái phép:

$ chmod 600 ~/revocation.crt

Chứng chỉ thu hồi phải được giữ an toàn để người dùng khác không thể thu hồi khóa của bạn. Như thông báo trạng thái, bạn nên xem xét sao lưu chứng chỉ lên các máy khác và in ra, miễn là bạn có thể đảm bảo nó đúng cách.

Cách nhập khoá công khai của người dùng khác

GPG sẽ vô dụng nếu bạn không thể nhận các khóa công khai khác từ những người mà bạn muốn liên lạc.
Bạn có thể nhập khóa công khai của ai đó bằng nhiều cách khác nhau. Nếu bạn đã lấy khoá công khai từ một người nào đó trong một tệp văn bản, GPG có thể nhập nó bằng lệnh sau:

$ gpg --import name_of_pub_key_file

Cũng có khả năng người mà bạn muốn liên lạc với đã tải lên khóa của họ đến một máy chủ khóa công khai. Những máy chủ chính này được sử dụng để chứa khóa công khai của mọi người từ khắp nơi trên thế giới.
Một trong những máy chủ khoá nổi tiếng có thể đồng bộ hóa thông tin của nó với nhiều máy chủ khác là máy chủ khoá công khai của MIT. Bạn có thể tìm kiếm mọi người theo tên hoặc địa chỉ email của họ bằng cách truy cập vào đây trong trình duyệt web của bạn:

https://pgp.mit.edu/

Bạn cũng có thể tìm kiếm máy chủ khoá từ trong GPG bằng cách gõ lệnh sau:

$ gpg --keyserver pgp.mit.edu  --search-keys search_parameters

Bạn có thể sử dụng phương pháp tìm kiếm này theo tên hoặc địa chỉ email. Bạn có thể nhập khoá mà bạn tìm thấy bằng cách làm theo hướng dẫn.

Cách xác minh và đăng nhập khóa

Mặc dù bạn có thể tự do phân phối tệp tin khóa công khai của mình và mọi người có thể sử dụng nó để liên hệ với bạn một cách an toàn, điều quan trọng là bạn có thể tin tưởng rằng khoá này thuộc về người mà bạn nghĩ nó trong quá trình truyền khoá công khai ban đầu.

Xác minh danh tính của người khác

Làm thế nào để bạn biết rằng người cung cấp cho bạn khóa công khai là chính danh? Trong một số trường hợp, điều này có thể đơn giản. Bạn có thể ngồi ngay bên cạnh người với máy tính xách tay của bạn, cả hai cùng mở và trao đổi các khóa. Đây là một cách khá an toàn để xác định rằng bạn đang nhận khóa chính xác, và chính danh.
Nhưng có nhiều trường hợp khác mà không thể liên lạc cá nhân như vậy. Bạn có thể không biết bên kia, hoặc bạn có thể bị cách ly bằng khoảng cách địa lý. Nếu bạn không bao giờ muốn truyền tin qua các kênh không an toàn, việc xác minh khoá công khai có thể là vấn đề lớn.
May thay, thay vì kiểm tra toàn bộ khóa công khai của cả hai bên, bạn chỉ cần so sánh “khóa vân tay” xuất phát từ các phím này. Điều này sẽ cho bạn một sự đảm bảo hợp lý rằng cả hai bạn đang sử dụng cùng một thông tin khóa công khai.
Bạn có thể lấy dấu vân tay của khoá công khai bằng cách gõ:

gpg --fingerprint your_email@address.com
Output
pub   4096R/311B1F84 2013-10-04
      Key fingerprint = CB9E C70F 2421 AF06 7D72  F980 8287 6A15 311B 1F84
 uid                  Test User <test.user@address.com>
 sub  4096R/8822A56A 2013-10-04

Điều này sẽ tạo ra một chuỗi số liệu được quản lý nhiều hơn để so sánh. Bạn có thể so sánh chuỗi này với người đó, hoặc với người khác có quyền truy cập vào người đó.

Ký một khóa của họ

Việc ký một khóa sẽ cho phép phần mềm của bạn hiểu rằng bạn tin tưởng vào khóa mà bạn đã được cung cấp và bạn đã xác minh rằng nó được liên kết với đúng người bạn cần nói chuyện.
Để ký một khóa mà bạn đã nhập, chỉ cần gõ:

$ gpg --sign-key email@example.com

Khi bạn ký khóa, điều này có nghĩa là bạn xác minh rằng bạn tin tưởng rằng người đó đúng là người họ tự nhận. Điều này cũng có thể giúp người khác quyết định xem có nên tin tưởng vào người đó hay không. Nếu ai đó tin cậy bạn, và họ thấy bạn đã ký được khóa của người này, họ cũng có thể tin tưởng vào danh tính của họ.
Bạn nên cho phép người mà khóa bạn ký khóa của họ tận dụng lợi thế của mối quan hệ tin cậy bằng cách gửi lại khoá đã ký. Bạn có thể thực hiện việc này bằng cách nhập:

$ gpg --output ~/signed.key --export --armor email@example.com

Bạn sẽ phải nhập mật khẩu lại. Sau đó, khoá công khai của họ, được ký bởi bạn, sẽ được hiển thị. Gửi cho họ điều này, để họ có thể tận dụng lợi ích từ việc đạt được “dấu phê duyệt” của bạn khi họ cần tương tác với người khác.
Khi họ nhận được khóa mới, ký tên này, họ có thể nhập nó, thêm thông tin xác nhận mà bạn đã tạo vào cơ sở dữ liệu GPG của họ. Họ có thể làm điều này bằng cách gõ:

$ gpg --import ~/signed.key

Giờ đây họ có thể chứng minh với những người khác rằng bạn tin tưởng rằng danh tính của họ là chính xác.

Làm thế nào để làm cho khóa công khai của bạn luôn có sẵn

Nhờ có cách mà mã hóa khóa công khai được thiết kế, không có gì độc hại hay nguy hiểm có thể xảy ra nếu những người lạ có khoá công khai của bạn.
Vì vậy việc công khai khóa công khai của bạn không hề gây hại mà trái lại còn giúp ích cho những người khác. Mọi người có thể tìm thấy thông tin của bạn để gửi thông điệp an toàn cho bạn ngay từ lần tương tác đáng ngờ đầu tiên.
Bạn có thể gửi bất kỳ ai khóa công khai của bạn bằng cách gõ yêu cầu từ hệ thống GPG:

gpg --output ~/mygpg.key --armor --export your_email@address.com
Output
-----BEGIN PGP PUBLIC KEY BLOCK-----
 Version: GnuPG v1.4.11 (GNU/Linux)
mQINBFJPCuABEACiog/sInjg0O2SqgmG1T8n9FroSTdN74uGsRMHHAOuAmGLsTse
9oxeLQpN+r75Ko39RVE88dRcW710fPY0+fjSXBKhpN+raRMUKJp4AX9BJd00YA/4
EpD+8cDK4DuLlLdn1x0q41VUsznXrnMpQedRmAL9f9bL6pbLTJhaKeorTokTvdn6
5VT3pb2o+jr6NETaUxd99ZG/osPar9tNThVLIIzG1nDabcTFbMB+w7wOJuhXyTLQ
JBU9xmavTM71PfV6Pkh4j1pfWImXc1D8dS+jcvKeXInBfm2XZsfOCesk12YnK3Nc
u1Xe1lxzSt7Cegum4S/YuxmYoh462oGZ7FA4Cr2lvAPVpO9zmgQ8JITXiqYg2wB3
. . .

Sau đó, bạn có thể gửi tệp này cho bên kia qua một phương tiện phù hợp.
Nếu bạn muốn xuất bản khóa của bạn tới một máy chủ chính, bạn có thể thực hiện nó theo cách thủ công thông qua các biểu mẫu có sẵn trên hầu hết các trang máy chủ.
Một lựa chọn khác là làm điều này thông qua giao diện GPG. Tìm ID chính của bạn bằng cách nhập:

$ gpg --list-keys your_email@address.com

Phần được đánh dấu trong đầu ra dưới đây là ID chính (tìm kiếm pub dọc theo cột bên trái nếu bạn không chắc chắn dùng cái nào). Đó là một cách ngắn nhất để tham khảo khóa của phần mềm nội bộ.

Output
pub   4096R/311B1F84 2013-10-04
uid                  Test User <test.user@address.com>
sub   4096R/8822A56A 2013-10-04

Để tải khoá của bạn lên một máy chủ khoá nào đó, bạn có thể sử dụng cú pháp sau:

$ gpg --send-keys --keyserver pgp.mit.edu key_id

Khóa sẽ được tải lên máy chủ được chỉ định. Sau đó, nó có thể sẽ được phân phối cho các máy chủ chính khác trên thế giới.

Mã hóa và giải mã thư với GPG

Bạn có thể dễ dàng mã hóa và giải mã thông điệp sau khi bạn chia sẻ khóa với bên kia.

Mã hóa thông điệp

Bạn có thể mã hóa thông điệp bằng cách sử dụng cờ “–encrypt” cho GPG. Cú pháp cơ bản sẽ là:

$ gpg --encrypt --sign --armor -r person@email.com name_of_file

Cú pháp này giúp mã hóa thông điệp sử dụng khóa công khai của người nhận, ký nó bằng khóa riêng của bạn để đảm bảo rằng nó đúng là do bạn gửi đi, và kết xuất thông điệp dưới dạng văn bản thay vì byte thô. Tên tập tin sẽ giống như tên tập tin đầu vào, nhưng với một phần mở rộng .asc.
Bạn nên đưa ra sau “-r” một người nhận thứ hai là địa chỉ email riêng của bạn nếu bạn muốn có thể đọc được thông điệp được mã hóa. Điều này là do thông điệp sẽ được mã hóa với khóa công khai của mỗi người và sẽ chỉ có thể được giải mật mã với khóa cá nhân có liên quan.
Vì vậy, nếu nó chỉ được mã hóa với khóa công khai của bên kia, bạn sẽ không thể xem lại thông điệp, trừ khi bạn bằng cách nào đó lấy được khóa riêng của họ. Thêm bản thân bạn như một người nhận thứ hai mã hóa thông điệp hai lần riêng biệt, một cho mỗi người nhận.

Giải mã thư

Khi bạn nhận được một thông điệp, chỉ cần gọi GPG vào tệp tin thông điệp:

$ gpg file_name.asc

Phần mềm sẽ nhắc bạn ngay khi cần thiết.
Nếu thay vì một tệp tin, bạn có thư như là một luồng văn bản thô, bạn có thể sao chép và dán nó sau khi gõ GPG mà không có bất kỳ đối số nào. Bạn có thể nhấn “CTRL-D” để biểu thị phần cuối của thông điệp và GPG sẽ giải mã nó cho bạn.

Cách thức bảo trì chính

Có một số thủ tục mà bạn có thể cần phải sử dụng thường xuyên để quản lý cơ sở dữ liệu quan trọng của mình.
Để liệt kê các khóa GPG có sẵn mà bạn có từ những người khác, bạn có thể phát hành lệnh này:

$ gpg --list-keys

Thông tin khóa của bạn có thể trở nên lỗi thời nếu bạn đang dựa vào thông tin lấy từ các máy chủ khoá công khai. Bạn không muốn dựa vào các phím thu hồi, bởi vì điều đó có nghĩa là bạn tin cậy các phím có khả năng bị xâm nhập.
Bạn có thể cập nhật thông tin chính bằng cách gõ:

$ gpg --refresh-keys

Thao tác này sẽ tìm nạp thông tin mới từ các máy chủ chính.
Bạn có thể kéo thông tin từ một máy chủ khoá cụ thể bằng cách sử dụng:

$ gpg --keyserver key_server --refresh-keys

Bạn có thể nhận được thông báo lỗi nếu bất kỳ khóa nào của bạn không thể tìm thấy trên máy chủ khoá.

Kết luận

Sử dụng GPG một cách chính xác có thể giúp bạn bảo mật truyền tin của bạn với những người khác nhau. Điều này cực kỳ hữu ích, không chỉ khi xử lý các thông tin nhạy cảm, mà còn trong giao tiếp hàng ngày.
Do cách truyền mã hoá nhất định có thể bị gắn cờ bởi các chương trình giám sát, bạn nên sử dụng mã hóa cho mọi thứ chứ không chỉ là dữ liệu “bí mật”. Điều đó sẽ khiến mọi người khó biết khi nào bạn gửi dữ liệu quan trọng hoặc chỉ gửi một lời chào thân thiện.

Bài viết liên quan

6 lý do doanh nghiệp nên lựa chọn đơn vị bảo mật hỗ trợ tuân thủ Nghị định 13
6 lý do doanh nghiệp nên lựa chọn đơn vị bảo mật hỗ trợ tuân thủ Nghị định 13
15/11/2023|Operations Security

Việc Chính phủ ban hành Nghị định 13/2023/NĐ-CP về Bảo mật dữ liệu cá nhân đã tạo nên một tác động đáng kể đối với nhiều doanh nghiệp tại Việt Nam. Tuân thủ và bảo vệ dữ liệu cá nhân không chỉ đòi hỏi nhiều thời gian và công sức lớn mà còn có thể …

Những thách thức của Nghị định 13 đối với doanh nghiệp vừa và nhỏ
Những thách thức của Nghị định 13 đối với doanh nghiệp vừa và nhỏ
13/11/2023|Operations Security

Sự ra đời của Nghị định 13/2023/NĐ-CP có ý nghĩa quan trọng trong sự phát triển công nghệ thông tin nói chung và việc bảo vệ dữ liệu cá nhân nói riêng tại Việt Nam. Song, văn bản này cũng đặt ra những thách thức đáng kể cho các doanh nghiệp, đặc biệt là những …

Downtime là gì? Cách giảm tình trạng downtime của website
Downtime là gì? Cách giảm tình trạng downtime của website
21/09/2023|Operations Security

Bạn cần biết những gì về thời gian downtime của website? Mặc dù hầu hết các website và dịch vụ web đều cố gắng hạn chế thời gian downtime (thời gian chết của website), đó vẫn là điều không thể tránh khỏi.