Sang đến phiên bản Raspbian Jessie, đăng nhập với user pi có thể dùng mật khẩu trong khi mặc định không thể đăng nhập bằng mật khẩu với user root. Về bảo mật, tốt nhất là đăng nhập bằng khóa.
Có nhiều ứng dụng giúp tạo ra cặp khóa (public và private). Khóa public để ở ssh server như RPi, khóa private để ở máy khác dùng để đăng nhập vào RPi. Mọi chuyện rất đơn giản tựa như ổ khóa (public key) và chìa khóa (private key), nhưng vì cặp khóa này có thể có nhiều định dạng khác nhau tùy theo ứng dụng tạo ra nó nên có thể gây rắc rối.
Nguyên lý
- Tạo ra cặp khóa công khai + riêng tư
- Đặt khóa công khai tại ssh server như RPi
- Đặt khóa riêng tư ở máy dùng đăng nhập từ xa vào RPi
- Dùng một ứng dụng ssh để đăng nhập vào RPi bằng khóa riêng tư
Phần 1 Dùng RPi để tạo ra cặp khóa (ở SSH server)
Tất nhiên là đầu tiên chúng ta phải có thể đăng nhập vào RPi với user pi và password. Ứng dụng giúp ssh vào RPi thường dùng là PuTTY và BitVise. Chúng ta nói về BitVise trước vì nó tương thích với khóa tạo ra từ Raspbian.
Dùng BitVise để năng nhập vào RPi
Sau khi login thành công thì xuất hiện cửa sổ Terminal (giống cửa sổ lệnh của PuTTY)
Dùng lệnh sau để tạo cặp khóa (Public và Private)
ssh-keygen -t rsa -C "Chuổi_bất_kỳ_không_khoảng_trắng"
*1 : Enter để chấp nhận thư mục chứa khóa sắp tạo ra
*2 và *3 : Enter để không dùng mật khẩu bảo vệ khóa
Sau đó thì trong thư mục ẩn /home/pi/.ssh có cặp khóa id_rsa và id_rsa.pub theo định dạng OpenSSH
- id_rsa.pub là khóa công khai, đặt ở RPi
- id_rsa là khóa riêng tư đặt ở máy dùng đăng nhập vào RPi, vì vậy cần phải lấy ra khỏi RPi
A) Người dùng có thể có nhiều khóa công khai (từ nhiều cặp khóa) nên các khóa này phải đưa vào một “túi đựng“.
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
Tiếp theo là một số qui định về thuộc tính, nếu không đúng thì có thể không dùng được khóa.
sudo chmod 700 ~/.ssh
sudo chmod 600 ~/.ssh/authorized_keys
B) Tiếp theo, lấy khóa riêng ra khỏi RPi
Cách đơn giản nhất là dùng clipboard.
Đọc nội dung file id_rsa ra màn hình Terminal rồi tô sáng nó để đưa vào clipboard (từ dòng BEGIN đến dòng END), sau đó ghi lại trên máy đang đăng nhập vào RPi (nên dùng Notepad++).
cat .ssh/id_rsa
Một cách khác là dùng (s)ftp để copy file
Script tạo khóa cho pi và root (Đăng nhập từ pi)
#!/bin/bash cd ~ echo "1. Tạo cặp khóa rsa..." ssh-keygen -t rsa -C "rpi@ly-le.info" if [ "$(whoami)" = "pi" ]; then mydir='/home/pi' yrdir='/root' yrusr='root' else mydir='/root' yrdir='/home/pi' yrusr='pi' fi cat $mydir/.ssh/id_rsa.pub | sudo tee -a $mydir/.ssh/authorized_keys &> /dev/null sudo chmod 700 $mydir/.ssh sudo chmod 600 $mydir/.ssh/authorized_keys cat $mydir/.ssh/id_rsa echo -e "\nTô sáng phần text trên đây để copy vào clipboard...\nsau đó dán thành file 'private key' tr$ read -n 1 -s -p "Gõ phím bất kỳ để tiếp tục... " echo 'OK' echo "2. Sao chép 'public key' cho user $yrusr..." sudo mkdir $yrdir/.ssh &> /dev/null cat $mydir/.ssh/id_rsa.pub | sudo tee -a $yrdir/.ssh/authorized_keys &> /dev/null sudo chown "$yrusr:$yrusr" $yrdir/.ssh sudo chown "$yrusr:$yrusr" $yrdir/.ssh/authorized_keys read -n 1 -s -p "3. Cho phép đang nhập bằng user root (Y/n)?" answer echo if [ "${answer,}" = 'y' ] || [ -z $answer ]; then sudo sed -i -r 's/^#?(PermitRootLogin ).+$/\1 without-password/' /etc/ssh/sshd_config sudo sed -i -r 's/^(StrictModes ).+$/\1 no/' /etc/ssh/sshd_config else sudo sed -i -r 's/^#?(PermitRootLogin ).+$/\1 no/' /etc/ssh/sshd_config sudo sed -i -r 's/^(StrictModes ).+$/\1 yes/' /etc/ssh/sshd_config fi read -n 1 -s -p "4. Không cho phép đăng nhập RPi bằng mật khẩu (Y/n)?" answer echo if [ "${answer,}" = 'y' ] || [ -z $answer ]; then sudo sed -i -r 's/^#?(PasswordAuthentication ).+$/\1no/' /etc/ssh/sshd_config else sudo sed -i -r 's/^(PasswordAuthentication .+)$/#\1/' /etc/ssh/sshd_config fi sudo service ssh restart
Cài đặt BitVise để dùng khóa riêng đăng nhập vào RPi
*1 : Ghi IP của RPi
*2 : Click để mở hộp thoại quản lý khóa “Bitvise Client Key Management”
*3 : Bấm nút Import, tìm đến file khóa private vừa tạo để nhập vào danh mục các khóa
*4 : Nhớ Location là “Global 1” hay từ khóa nào khác
*5 : Nhập vào khung Authentication như trong vòng tròn đỏ
Xong rồi, thử login, chúng ta sẽ đăng nhập vào RPi mà không dùng mật khẩu
Chuyển đổi khóa private để dùng với PuTTY
PuTTY dùng định dạng khóa riêng nên phải chuyển đổi private key dạng OpenSSH thành dạng PuTTY.
Mở BitVise Client Key Management, chọn khóa muốn chuyển đổi, bấm Export
Đặt tên khóa theo PuTTY có phần mở rộng là .ppk
Cách khác (Dùng PuTTYgen)
Mở PuTTYgen, bấm nút Load, Browse (All File) tìm đến file khóa private để nhập vào PuTTYgen, PuTTYgen chấp nhận cả khóa dạng OpenSSH lẫn dạng PuuTY. Sau đó bấm nút Save private key *1 để lưu key dạng PuTTY
Phần 2 Tạo cặp khóa bằng PuTTYgen (ở SSH client)
{ PuTTY, PuTTYgen, Pageant } được đề cập trong phần này đều thuộc gói ứng dụng PuTTY
Chạy PuTTYgen, bấm Generate và di chuyển chuột liên tục để tạo giá trị ngẫu nhiên cho khóa.
*1 : Copy dòng text này làm khóa công khai.
Chuyển khóa công khai vào RPi thông qua clipboard như ở phần trước. Có thể nối vào file authorized_keys, mỗi dòng một khóa công khai. Nhớ chmod và chown nếu cần.
*2 : Lưu thành khóa riêng (private key), dùng cho PuTTY
Chú thích: Nút Save public key ghi lại khóa công khai dưới dạng PuTTY (.ppk). Có thể chuyển khóa công khai dạng PuTTY (.ppk) thành dạng OpenSSH để dùng với RPi như sau:
Dùng Notepadd++ mở file khóa công khai .ppk,
- xóa các dòng BEGIN và END,
- xóa dòng Comment,
- xóa các dấu ngắt dòng để nối text thành một dòng duy nhất
- Thêm ở đầu dòng ssh-rsa và một khoảng trắng. Thêm ở cuối dòng một khoảng trắng và chuỗi tùy ý như pi@RPI-22
Lưu file, không có phần mở rộng để phân biệt với file .ppk
Cài đặt PuTTY để dùng khóa riêng đăng nhập vào RPi
*1 : ip của RPi
*2 : bấm vào đây để nhập tên user đăng nhập (ô đầu tiên)
*3 : bấm vào SSH, chọn Auth rồi Browse đến khóa riêng (private key)
*4 và *5 : Quay lại mục Session (đầu tiên), cho tên Session và bấm Save
Cách khác (dùng Pageant để quản lý khóa)
Thay vì chỉ định khóa riêng ở bước *3 để PuTTY quản lý, có thể dùng Pageant quản lý khóa giúp PuTTY
Chạy Pageant, bấm Add Key để thêm private key. Pageant luôn chạy ngầm và cung cấp khóa cho PuTTY đăng nhập.
Phần 3 Sao chép cặp khóa của pi để dùng cho root
Với thẻ nhớ mới được ghi từ file ảnh Raspbian, root chưa thể login vào RPi bằng mật khẩu. Vì vậy chúng ta dùng cặp khóa của pi để đăng nhập từ root.
sudo mkdir /root/.ssh
sudo cp -f /home/pi/.ssh/* /root/.ssh
sudo chown root:root /root/.ssh
sudo chown root:root /root/.ssh/authorized_keys
sudo sed -i -r 's/^#?(PermitRootLogin ).+$/\1 without-password/' /etc/ssh/sshd_config
sudo sed -i -r 's/^(StrictModes ).+$/\1 no/' /etc/ssh/sshd_config
Trước hết là sao chép các khóa công khai đã tạo được cho pi sang thư mục root. Bước tiếp theo là chown root cho thư mục .ssh và “túi đựng khóa công khai” authorized_keys, cuối cùng là sửa file cấu hình sshd_config để cho phép đăng nhập bằng user root.
Khởi động lại ssh server trên RPi
service ssh restart
Bây giờ chúng ta có thể đăng nhập với user root bằng khóa riêng của pi đã tạo.
Chú thích
Nếu vì lý do nào đó, khóa của root được tạo trước. Chúng ta cũng có thể sao chép thành khóa của pi theo cách tường tự
mkdir /home/pi/.ssh
cp /root/.ssh/* /home/pi/.ssh
chown pi:pi /home/pi/.ssh
chown pi:pi /home/pi/.ssh/authorized_keys
Phần 4 Để RPi không chấp nhận đăng nhập bằng mật khẩu
Sửa sshd_config bằng câu lệnh sau, rồi khởi động lại ssh server
sudo sed -i -r 's/^#?(PasswordAuthentication ).+$/\1no/' /etc/ssh/sshd_config
sudo
service ssh restart