Git-Crypt là một công cụ cho phép chúng ta mã hoá và giải mã các tập tin với GPG (GNU Privacy Guard) keys. Sử dụng Git-Crypt chúng ta có thể dễ dàng chọn các tập tin cần mã hoá để mã hoá trước khi push chúng lên remote server. Việc sử dụng Git-Crypt sẽ góp phần vào việc bảo vệ các dữ liệu nhạy cảm đang chứa trong project của chúng ta khi mà dữ liệu đó được publish hoặc đẩy lên Git repository.
1. Cài đặt git-crypt
Chúng ta có thể tham khảo cách cài đặt theo tài liệu sau: Cài đặt Git-Crypt
Ví dụ để cài đặt trên Mac OS ta sẽ cài đặt qua Homebrew với câu lệnh đơn giản sau:
brew install git-crypt
2. Tạo repository và khởi tạo git-crypt
Giả sử chúng ta có một repository và trong repository đó chúng ta có một file dùng để lưu chữ các api keys.
mkdir project1
cd project1
echo "Project document" > README.md
echo "Apikey: jkdjf234234" > apis.txt
git init
Trong ví dụ trên ta có một dự án với tên là project1 trong project1 ta tạo 2 tập tin là README.md(Chứa các tài liệu cơ bản của dự án) và apis.txt (Chứa các dữ liệu nhạy cảm liên quan đến các api keys của dự án).
Sau khi đã khởi tạo git như trên ta sẽ tiếp tục khởi tạo git-crypt cho dự án.
git-crypt init
Sau khi thực hiện xong câu lệnh trên ta sẽ thấy output hiện ra:
Generating key...
Câu lệnh khởi tạo git-crypt sẽ tạo ra một symmetric key cho project của chúng ta. Việc cần làm lúc này là chúng ta sẽ lưu trữ key này lại để phục vụ cho việc giải mã sau này.
git-crypt export-key git-crypt-key
Trong project của chúng ta sẽ xuất hiện 1 file mới là git-crypt-key, ta sẽ lưu trữ file này cẩn thận để phục vụ cho việc giải mã.
3. Cấu hình các tập tin cần mã hoá
Để git-crypt biết được các tập tin nào trong project cần được mã hoá, chúng ta cần tạo 1 file là .gitattributes và thêm các điều kiện mã hoá vào đó.
echo "apis.txt filter=git-crypt diff=git-crypt" > .gitattributes
Như câu lệnh trên, chúng ta sẽ tạo ra file .gitattributes với config sẽ mã hoá file apis.txt
Trong trường hợp nếu ta muốn mã hoá hết các tập tin có phần mở rộng là .key ta sẽ thêm config như sau:
*.key filter=git-crypt diff=git-crypt
Hoặc nếu muốn mã hoá hết các tập tin của thư mục keys ta sẽ config:
keys/** filter=git-crypt diff=git-crypt
Để tránh việc file .gitattributes bị mã hoá bởi các điều kiện được chứa bên trong nó, ta sẽ thêm:
.gitattributes !filter !diff
4. Kiểm tra trạng thái và mã hoá
Để kiểm tra trạng thái của các tập tin mã hoá chúng ta sử dụng câu lệnh sau:
git-crypt status
Ta có thể thêm tham số -e để chỉ trả về các tập tin đã được mã hoá.
git-crypt status -e
not encrypted: .gitattributes
not encrypted: README.md
encrypted: apis.txt
not encrypted: git-crypt-key
Với kết quả trạng thái như trên ta thấy apis.txt đã được đánh dấu mã hoá đúng theo mong muốn của chúng ta. Vậy ta sẽ tiến hành commit và thực hiện mã hoá.
git add * git commit -m "Add files" git-crypt lock
Sau khi lock tập tin apis.txt sẽ được mã hoá nội dung và kết quả mã hoá sẽ là:
^@GITCRYPT^@ÖÌr<87>^F(6Ø%åõaÊE\Æ^P^]ûëGw^PX~ñEÝý<8a>
Để giải mã ta sẽ sử dụng git-crypt-key đã tạo ở bước trước đó để giải mã thông tin.
git-crypt unlock git-crypt-key
Vì git-crypt-key là chìa khoá để giải mã các tập tin đã bị mã hoá nên việc lưu trữ nó là vô cùng quan trọng, bởi việc thất lạc hoặc bị sao chép sẽ đều có thể dẫn đến rủi ro gây mất mát và rò rỉ thông tin nhạy cảm.
5. Sử dụng cùng git-crypt key cho nhiều repositories khác nhau
Chúng ta có thể sử dụng 1 git-crypt key cho nhiều dự án khác nhau, việc tái sử dụng này khá đơn giản chỉ cần một vài thay đổi trong bước khởi tạo git-crypt như sau.
Việc khởi tạo repository và git vẫn giống như mô tả ở trên chỉ khác là thay vì sử dụng git-crypt init thì ta sử dụng git-crypt unlock
mkdir project2
cd project2
echo "api 1" > api.key
git init
echo "*.key filter=git-crypt diff=git-crypt" > .gitattributes
git add *
git commit -m "init"
git-crypt unlock ../project1/git-crypt-key
git-crypt lock
Trong ví dụ trên project2 và project1 cùng sử dụng chung 1 key git-crypt-key. Git-crypt trong project2 được cấu hình sẽ mã hoá các tập tin mà có phần mở rộng là .key.
Leave a Reply