Đăng nhập không dùng mật khẩu

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ý

  1. Tạo ra cặp khóa công khai + riêng tư
  2. Đặt khóa công khai tại ssh server như RPi
  3. Đặt khóa riêng tư ở máy dùng đăng nhập từ xa vào RPi
  4. 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 pipassword. Ứng dụng giúp ssh vào RPi thường dùng là PuTTYBitVise. Chúng ta nói về BitVise trước vì nó tương thích với khóa tạo ra từ Raspbian.

Screenshot-2016-04-25-14.21

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"
 

Screenshot-2016-04-25-14.35

*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 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

Screenshot-2016-04-25-15.08


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

Screenshot-2016-04-25-15.21

*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

Screenshot-2016-04-25-17.00

Screenshot-2016-04-25-17.05

Đặt tên khóa theo PuTTY có phần mở rộng là .ppk

Cách khác (Dùng PuTTYgen)

Screenshot-2016-04-26-08.41

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

Screenshot-2016-04-25-17.27

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.

Screenshot-2016-04-25-18.31

*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ớ chmodchown 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

Screenshot-2016-04-25-17.14

*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

Screenshot 2016-04-25 22.05.15
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“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

 

Leave a Comment

Filed under Software

Leave a Reply