Nếu bạn buộc phải sử dụng tập lệnh Linux để kết nối với tài nguyên được bảo vệ bằng mật khẩu, bạn có thể cảm thấy không thoải mái khi đặt mật khẩu đó vào tập lệnh. OpenSSL giải quyết vấn đề đó cho bạn.
Mật khẩu và Tập lệnh
Đặt mật khẩu trong các tập lệnh shell không phải là một ý tưởng tuyệt vời. Trên thực tế, đó là một ý tưởng thực sự tồi. Nếu tập lệnh rơi vào tay kẻ xấu, mọi người đọc nó có thể thấy mật khẩu là gì. Nhưng nếu bạn buộc phải sử dụng script, bạn có thể làm gì khác?
Bạn có thể nhập mật khẩu theo cách thủ công khi quá trình đạt đến điểm đó, nhưng nếu tập lệnh sẽ chạy mà không được giám sát, điều đó sẽ không hoạt động. Rất may, có một giải pháp thay thế cho việc mã hóa cứng mật khẩu vào tập lệnh. Nói cách khác, nó sử dụng một mật khẩu khác để đạt được điều này, cùng với một số mã hóa mạnh.
Trong tình huống ví dụ của chúng tôi, chúng tôi cần tạo kết nối từ xa với máy tính Fedora Linux từ máy tính Ubuntu của chúng tôi. Chúng tôi sẽ sử dụng tập lệnh Bash shell để tạo kết nối SSH với máy tính Fedora. Tập lệnh phải chạy không giám sát và chúng tôi không muốn đặt mật khẩu cho tài khoản từ xa trong tập lệnh. Chúng tôi không thể sử dụng khóa SSH trong trường hợp này vì chúng tôi đang giả vờ rằng chúng tôi không có bất kỳ quyền kiểm soát hoặc quyền quản trị nào đối với máy tính Fedora.
Chúng tôi sẽ sử dụng bộ công cụ OpenSSL nổi tiếng để xử lý mã hóa và một tiện ích có tên sshpass
để nhập mật khẩu vào lệnh SSH.
LIÊN QUAN: Cách tạo và cài đặt khóa SSH từ Linux Shell
Cài đặt OpenSSL và sshpass
Vì nhiều công cụ mã hóa và bảo mật khác sử dụng OpenSSL nên nó có thể đã được cài đặt trên máy tính của bạn. Tuy nhiên, nếu không, bạn chỉ mất một chút thời gian để cài đặt.
Trên Ubuntu, gõ lệnh này:
sudo apt get openssl
Để cài đặt sshpass
, sử dụng lệnh này:
sudo apt install sshpass
Trên Fedora, bạn cần nhập:
sudo dnf install openssl
Lệnh cài đặt sshpass
Là:
sudo dnf install sshpass
Trên Manjaro Linux, chúng ta có thể cài đặt OpenSSL với:
sudo pacman -Sy openssl
Cuối cùng, để cài đặt sshpass
, sử dụng lệnh này:
sudo pacman -Sy sshpass
Mã hóa trên dòng lệnh
Trước khi chúng tôi sử dụng openssl
lệnh bằng script, hãy làm quen với nó bằng cách sử dụng nó trên dòng lệnh. Giả sử rằng mật khẩu cho tài khoản trên máy tính từ xa là rusty!herring.pitshaft
. Chúng tôi sẽ mã hóa mật khẩu đó bằng cách sử dụng openssl
.
Chúng tôi cần cung cấp mật khẩu mã hóa khi chúng tôi thực hiện. Mật khẩu mã hóa được sử dụng trong quá trình mã hóa và giải mã. Có rất nhiều tham số và tùy chọn trong openssl
chỉ huy. Chúng tôi sẽ xem xét từng người trong số họ trong giây lát.
echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'
Đang sử dụng echo
để gửi mật khẩu tài khoản từ xa thông qua một đường ống và vào openssl
chỉ huy.
Các openssl
tham số là:
- enc -aes-256-cbc: Loại mã hóa. Chúng tôi đang sử dụng mật mã khóa 256 bit Chuẩn mã hóa nâng cao với chuỗi khối mã hóa.
- -md sha512: Loại thông báo (băm) thông báo. Chúng tôi đang sử dụng thuật toán mật mã SHA512.
-
-a: Điều này nói với
openssl
để áp dụng mã hóa base-64 sau giai đoạn mã hóa và trước giai đoạn giải mã. - -pbkdf2: Sử dụng Chức năng lấy lại khóa dựa trên mật khẩu 2 (PBKDF2) khiến một cuộc tấn công vũ lực khó thành công hơn trong việc đoán mật khẩu của bạn. PBKDF2 yêu cầu nhiều tính toán để thực hiện mã hóa. Kẻ tấn công sẽ cần phải sao chép tất cả các tính toán đó.
- -iter 100000: Đặt số lượng tính toán mà PBKDF2 sẽ sử dụng.
- -Muối: Việc sử dụng giá trị muối được áp dụng ngẫu nhiên làm cho đầu ra được mã hóa luôn khác nhau, ngay cả khi văn bản thuần túy giống nhau.
-
-pass pass: ‘pick.your.password’: Mật khẩu mà chúng tôi cần sử dụng để giải mã mật khẩu từ xa được mã hóa. Người thay thế
pick.your.password
với một mật khẩu mạnh mẽ do bạn chọn.
Phiên bản được mã hóa của rusty!herring.pitshaft
mật khẩu được ghi vào cửa sổ đầu cuối.
Để giải mã điều này, chúng ta cần chuyển chuỗi mã hóa đó vào openssl
với cùng các tham số mà chúng tôi đã sử dụng để mã hóa, nhưng thêm vào -d
(giải mã) tùy chọn.
echo U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'
Chuỗi được giải mã và văn bản gốc của chúng tôi — mật khẩu cho tài khoản người dùng từ xa — được ghi vào cửa sổ đầu cuối.
Điều đó chứng tỏ rằng chúng tôi có thể mã hóa mật khẩu tài khoản người dùng từ xa của mình một cách an toàn. Chúng tôi cũng có thể giải mã nó khi cần bằng mật khẩu mà chúng tôi đã cung cấp trong giai đoạn mã hóa.
Nhưng điều này có thực sự cải thiện tình hình của chúng ta? Nếu chúng ta cần mật khẩu mã hóa để giải mã mật khẩu tài khoản từ xa, chắc chắn mật khẩu giải mã sẽ cần phải có trong script? Vâng, có, nó có. Nhưng mật khẩu tài khoản người dùng từ xa được mã hóa sẽ được lưu trữ trong một tệp ẩn khác. Các quyền trên tệp sẽ ngăn không cho bất kỳ ai ngoài bạn — và người dùng gốc của hệ thống, rõ ràng — truy cập vào tệp.
Để gửi đầu ra từ lệnh mã hóa đến một tệp, chúng ta có thể sử dụng chuyển hướng. Tệp được gọi là “.secret_vault.txt.” Chúng tôi đã thay đổi mật khẩu mã hóa thành một thứ gì đó mạnh mẽ hơn.
echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' > .secret_vault.txt
Không có gì hiển thị xảy ra, nhưng mật khẩu được mã hóa và gửi đến tệp “.secret_vault.txt”.
Chúng tôi có thể kiểm tra xem nó có hoạt động hay không bằng cách giải mã mật khẩu trong tệp ẩn. Lưu ý rằng chúng tôi đang sử dụng cat
ở đây, không phải echo
.
cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password'
Mật khẩu được giải mã thành công từ dữ liệu trong tệp. Chúng tôi sẽ sử dụng chmod
để thay đổi các quyền trên tệp này để không ai khác có thể truy cập vào nó.
chmod 600 .secret_vault.txt
ls -l .secret_vault.txt
Sử dụng mặt nạ quyền 600 sẽ xóa tất cả quyền truy cập của bất kỳ ai khác ngoài chủ sở hữu tệp. Bây giờ chúng ta có thể chuyển sang viết kịch bản của mình.
LIÊN QUAN: Cách sử dụng lệnh chmod trên Linux
Sử dụng OpenSSL trong Tập lệnh
Kịch bản của chúng tôi khá đơn giản:
#!/bin/bash # name of the remote account REMOTE_USER=geek # password for the remote account REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password') # remote computer REMOTE_LINUX=fedora-34.local # connect to the remote computer and put a timestamp in a file called script.log sshpass -p $REMOTE_PASSWD ssh -T $REMOTE_USER@$REMOTE_LINUX << _remote_commands echo $USER "-" $(date) >> /home/$REMOTE_USER/script.log _remote_commands
- Chúng tôi đặt một biến có tên là
REMOTE_USER
thành “geek.” - Sau đó, chúng tôi đặt một biến có tên là
REMOTE_PASSWD
thành giá trị của mật khẩu đã giải mã được lấy từ tệp “.secret_vault.txt”, sử dụng cùng một lệnh mà chúng tôi đã sử dụng một lúc trước. - Vị trí của máy tính từ xa được lưu trữ trong một biến có tên là
REMOTE_LINUX
.
Với thông tin đó, chúng tôi có thể sử dụng ssh
lệnh kết nối với máy tính từ xa.
- Các
sshpass
lệnh là lệnh đầu tiên trên đường kết nối. Chúng tôi sử dụng nó với-p
(mật khẩu) tùy chọn. Điều này cho phép chúng tôi chỉ định mật khẩu sẽ được gửi đếnssh
chỉ huy. - Chúng tôi sử dụng
-T
(vô hiệu hóa phân bổ đầu cuối giả) vớissh
bởi vì chúng tôi không cần phải cấp phát TTY giả cho chúng tôi trên máy tính từ xa.
Chúng tôi đang sử dụng một đoạn ngắn tài liệu đây để chuyển một lệnh đến máy tính từ xa. Mọi thứ giữa hai _remote_commands
các chuỗi được gửi dưới dạng hướng dẫn đến phiên người dùng trên máy tính từ xa — trong trường hợp này, đó là một dòng lệnh Bash duy nhất.
Lệnh được gửi đến máy tính từ xa chỉ cần ghi tên tài khoản người dùng và dấu thời gian vào một tệp có tên “script.log”.
Sao chép và dán tập lệnh vào trình chỉnh sửa và lưu vào tệp có tên “go-remote.sh”. Hãy nhớ thay đổi các chi tiết để phản ánh địa chỉ của máy tính từ xa, tài khoản người dùng từ xa và mật khẩu tài khoản từ xa của riêng bạn.
Sử dụng chmod
để làm cho tập lệnh có thể thực thi được.
chmod +x go-remote.sh
Tất cả những gì còn lại là để thử nó. Hãy bắt đầu kịch bản của chúng tôi.
./go-remote.sh
Bởi vì tập lệnh của chúng tôi là một mẫu tối giản cho một tập lệnh không cần giám sát, không có đầu ra cho thiết bị đầu cuối. Nhưng nếu chúng ta kiểm tra tệp “script.log” trên máy tính Fedora, chúng ta có thể thấy rằng các kết nối từ xa đã được thực hiện thành công và tệp “script.log” đã được cập nhật với dấu thời gian.
cat script.log
Mật khẩu của bạn là riêng tư
Mật khẩu tài khoản từ xa của bạn không được ghi trong tập lệnh.
Và mặc dù mật khẩu giải mã Là, trong script, không ai khác có thể truy cập vào tệp “.secret_vault.txt” của bạn để giải mã nó và truy xuất mật khẩu tài khoản từ xa.