Thursday, December 19, 2013

SSH Tutorial

SSH (Secure Shell) là một giao thức mạng dùng để thiết lập kết nối mạng một cách bảo mật. SSH hoạt động ở lớp trên trong mô hình phân lớp TCP/IP. Các công cụ SSH (như là OpenSSH, …) cung cấp cho người dùng cách thức để thiết lập kết nối mạng được mã hoá để tạo một kênh kết nối riêng tư.
SSH là một chương trình tương tác giữa máy chủ và máy khách có sử dụng cơ chế mã hoá đủ mạnh nhằm ngăn chặn các hiện tượng nghe trộm, đánh cắp thông tin trên đường truyền. Các chương trình trước đây: telnet, rlogin không sử dụng phương pháp mã hoá. Vì thế bất cứ ai cũng có thể nghe trộm thậm chí đọc được toàn bộ nội dung của phiên làm việc bằng cách sử dụng một số công cụ đơn giản. Sử dụng SSH là biện pháp hữu hiệu bảo mật dữ liệu trên đường truyền từ hệ thống này đến hệ thống khác.
SSH làm việc thông qua 3 bước đơn giản:
* Định danh host – xác định định danh của hệ thống tham gia phiên làm việc SSH.
* Mã hoá – thiết lập kênh làm việc mã hoá.
* Chứng thực – xác thực người sử dụng có quyền đăng nhập hệ thống.
Xem ssh đã được cài đặt trên máy hay chưa.
#rpm -qa | grep ssh
Nếu chưa có, ta có thể cài đặt từ Internet bằng command sau:
#yum -y install ssh
Tất cả các tập tin cấu hình của ssh đều nằm trong thư mục /etc/ssh.Ta sẽ khảo sát sơ lược một số file trong thư mục ssh này:
+ moduli: Chứa một nhóm Diffie-Hellman được sử dụng cho việc trao đổi khóa Diffie-Hellman, nó thực sự quantrọng để xây dựng một lớp bảo mật ở tầng vận chuyển dữ liệu.Khi các khóa được trao đổi với nhau bắt đấu ở một phiên kết nối SSH, một share secret value được tạo ra và không thể xác định bởi một trong hai bên kết nối, giá trị này sau đó sẽ được dùng để cung cấp chứng thực cho host.
+ ssh_configfile cấu hình mặc định cho SSH client của hệ thống.
+ sshd_config: File cấu hình cho sshd deamon.
+ ssh_host_dsa_key: DSA private key được sử dụng với sshd deamon.
+ ssh_host_dsa_key.pub: DSA public key được sử dụng bởi sshd deamon.
+ ssh_host_key: RSA private key được sử dụng bởi sshd deamon cho phiên bản 1 của giao thức SSH.
+ ssh_host_key.pub: RSA public key được sử dụng bởi sshd deamon cho phiên bản 1 của giao thức SSH.
+ ssh_host_rsa_key: RSA private key được sử dụng bởi sshd deamon cho phiên bản 2 của giao thức SSH.
+ ssh_host_rsa_key.pub: RSA public key được sử dụng bởi sshd deamon cho phiên bản 2 của giao thức SSH.
Password Authentication:
Trên windows
- Chạy puttygen > generate > rà chuột vào vùng trống cho tới khi sinh key
- Đặt Key passphrase và Confirm passphrase (password để bảo vệ private key)
- Save lại Public Key (nằm trên Server) ví dụ D:\public_key.txt và save Private Key (Nằm trên máy remote) ví dụ D:\private_key
Trên Server Linux
- # vi /etc/ssh/sshd_config
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no # yes > cho phép user login bằng password; no > không cho phép login bằng password (sau khi đã cấu hình sử dụng public/private key)
# cd /root
# mkdir .ssh
# cd /root/.ssh/
# touch authorized_keys
# chmod 600 authorized_keys
copy lại nội dung public key trên puttygen và paste vào file authorized_keys(trong file này mỗi public key sẽ cách nhau 1 dòng) và save lại
Restart ssh # /etc/init.d/sshd restart


How to restrict users to SFTP only instead of SSH


Sometimes you want to have users, that have access to files on your server, but don't want them to be able to log in and execute commands on your server.
This is done quite easily.
Add user as usually and assign him a password. Then run the following command (replace the 'username' with real user name):
root@host # usermod -s /usr/lib/sftp-server username
This changes user's shell to sftp-server.
The last step for this to work is to add '/usr/lib/sftp-server' to /etc/shells to make it a valid shell, eg. like this:
root@host # echo '/usr/lib/sftp-server' >> /etc/shells
There. Now you've setup a user who can only access your server with SFTP.

Using iptables to allow only specific hosts to connect
An alternative to TCP wrappers (although you can use both at the same time) is limiting SSH access with iptables. Here's a simple example of how you can allow only a specific host to connect to your SSH service:
~# iptables -A INPUT -p tcp -m state --state NEW --source 193.180.177.13 --dport 22 -j ACCEPT
And make sure no one else has access to SSH service:
~# iptables -A INPUT -p tcp --dport 22 -j DROP
Save your new rules and you're all done.
SSH time-lock tricks
You can also use different iptables parameters to limit connections to the SSH service for specific time periods. You can use the /second, /minute, /hour, or /day switch in any of the following examples.
In the first example, if a user enters the wrong password, access to the SSH service is blocked for one minute, and the user gets only one login try per minute from that moment on:
~# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
~# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP
In a second example, iptables are set to allow only host 193.180.177.13 to connect to the SSH service. After three failed login tries, iptables allows the host only one login try per minute:
~# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
~# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -j DROP


SSH là viết tắt của từ tiếng Anh “Secure SHell”, là một giao thức mạng có mã hoá để đảm bảo an toàn dữ liệu truyền tải (1), đăng nhập dòng lệnh từ xa (2), thực thi lệnh từ xa (3) và các dịch vụ mạng an toàn khác giữa hai máy tính đã được kết nối với một phía chạy SSH Server và phía kia là SSH Client.
openssh
Ở bài viết này chúng tôi xin hướng dẫn sử dụng cặp khoá công khai / bí mật cho 3 chức năng thường được sử dụng nhất của SSH.

1. Cài đặt SSH Server và SSH Client

Ở trên Linux, thông thường chúng ta sử dụng OpenSSH. Ở đây chúng tôi hướng dẫn cài đặt trên Ubuntu/Debian
Phía Server:
apt-get install openssh-server
Phía Client:
apt-get install openssh-client
Bạn có thể cài đặt gói ssh để được cả openssh-serveropenssh-client
apt-get install ssh

2. Tạo và cài đặt cặp key – khoá công khai / bí mật

Sử dụng cặp khoá công khai / bí mật sẽ giúp việc xác thực giữa ssh client và ssh server mà không cần sử dụng đến mật khẩu của user.

2.1 Tạo cặp key

Sử dụng lệnh ssh-keygen để tạo cặp key.
Cách đơn giản nhất, các bạn chỉ cần gọi lệnh ssh-keygen không kèm theo bất kỳ tuỳ chọn nào
[root@a.wikilinux.vn:~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
40:f3:bf:4e:f3:6c:26:56:f3:04:3a:28:de:17:17:3a root@a.wikilinux.vn.itim.vn
The key’s randomart image is: +–[ RSA 2048]—-+
| o                                |
| . o                              |
| . .                               |
| . . o                            |
| S..o o                         |
|   . . E.+ .                    |
| . o +* +                     |
| . .o++o .                    |
| o.+o                           |
+———————+
[root@a.wikilinux.vn:~]#
Các bạn sẽ nhận được câu hỏi về đặt passphrase, nếu bạn không chắc hiểu về nó, thì bạn nên bỏ qua bằng cách enter.
Mọi thứ mặc định đều ổn, sau khi thực hiện xong bạn sẽ có cặp key nằm ở thư mục ~/.ssh/, với khoá bí mật (private key) là file id_rsa và khoá công khai (public key) id_rsa.pub. Đúng như tên gọi, các bạn cần giữ bí mật về nội dung của file id_rsa và đẩy đi file id_rsa.pub cho phía server cần được xác thực.
Các bạn có thể thay đổi tên cặp key được tạo với tuỳ chọn -f, thay đổi kiểu mã hoá mặc định từ rsa sang dsa với tuỳ chọn -t, và nhiều tuỳ chọn khác các bạn có thể đọc thêm man.

2.2 Cài đặt khoá công khai

Cài đặt khoá công khai, tức là bạn cần đẩy (ghi vào cuối file) được nội dung file khoá công khai id_rsa.pub vừa tạo vào file ~/.ssh/authorized_keys ở phía ssh server.
Cách đơn giản nhất, bạn dùng lệnh ssh-copy-id để thực hiện điều này
ssh-copy-id [-i [identity_file]] [user@]machine
Ví dụ:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@b.wikilinux.vn

3. Sử dụng

3.1 Đăng nhập từ xa (Remote login)

Sau khi đã cài đặt được khoá công khai của user trên a.wikilinux.vn lên b.wikilinux.vn, giờ việc đăng nhập từ xa (ssh) từ a.wikilinux.vn lên b.wikilinux.vn sẽ không cần dùng đến mật khẩu.
[root@a.wikilinux.vn:~]# ssh b.wikilinux.vn


[root@b.wikilinux.vn:~]#

3.2 Copy không cần mật khẩu (password)

Việc copy file bằng lệnh scp từ b.wikilinux.vn sang a.wikilinux.vn cũng không cần xác thực password.
[root@a.wikilinux.vn:/tmp]# scp root@b.wikilinux.vn:/tmp/a.txt .
a.txt                                                        100% 7196 7.0KB/s 00:00
[root@a.wikilinux.vn:/tmp]#

3.3 Thực hiện lệnh từ xa

Đứng từ a.wikilinux.vn, chúng ta có thể tạo 1 phiên ssh để thực hiện 1 lệnh (hoặc 1 số lệnh) trên phía b.wikilinux.vn mà không cần xác thực password.
Ví dụ chúng ta muốn cài vim lên b.wikilinux.vn:
[root@a.wikilinux.vn:~]# ssh b.wikilinux.vn apt-get install vim
Điều này rất có ý nghĩa trong việc làm việc với nhiều servers khác nhau.
Ví dụ chúng ta có 100 servers có tên từ b1.wikilinux.vn -> b100.wikilinux.vn, chúng ta cần cài vim lên cả 100 servers này. Việc này thực hiện hết sức dễ dàng sau khi đã cài đặt cặp key từ a.wikilinux.vn lên cả 100 servers kia, như sau:
[root@a.wikilinux.vn:~]# for i in {1..100}; do ssh b${i}.wikilinux.vn apt-get install -y vim; done

Tiếp tục với chủ đề SSH, ở bài viết này chúng ta sẽ cùng tìm hiểu về các loại/kiểu Port Forwarding
* Bài trước: Chuỗi bài về SSH (phần 1) – SSH sử dụng cặp khoá công khai / bí mật
 ssh2
Có 3 loại SSH port forwarding là:
  • Local port forwarding: là dạng kết nối từ phía SSH client được chuyển tiếp qua SSH server, rồi đi đến host/server đích.
  • Remote port forwarding: kết nối từ phía SSH server được chuyển tiếp qua SSH client, rồi đi đến host/server đích.
  • Dynamic port forwarding: tương tự “local port forwarding”, kết nối từ phía SSH client được chuyển tiếp qua SSH server, rồi đến đích tuỳ ý không định trước.

1. Local port forwarding

ssh2_lpf
Mở kết nối ssh tới ssh server với tuỳ chọn “-L port:host:hostport” trong đó
  • port là cổng ở phía ssh client được chỉ định để mở socket.
  • host:hostport là socket đích muốn tới (nhìn từ phía ssh server).
Chúng ta sẽ làm rõ hơn vấn đề thông qua ví dụ giả định:
  • Desktop của bạn A (phía ssh client) có IP 192.168.1.101
  • Server trung gian B (phía ssh server) có IP 172.16.0.111
  • Đích muốn đến là web server X, có IP 1.1.1.1, có mở cổng 22/SSH và chỉ chấp nhận kết nối từ Server B.
Thay cho việc phải ssh từ A lên B, rồi tiếp tục ssh lên đích là server X, chúng ta có thể mở một “cánh cửa thần kỳ” là một socket ở phía A để lên X như sau:
ssh -L 2222:1.1.1.1:22 username@172.16.0.111
Sau khi kết nối thành công, phía host A (ssh client) sẽ thấy một socket là 127.0.0.1:2222 được mở bởi ssh
[root@A:~]# netstat -lntp | grep 2222
tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN 10469/ssh
Bây giờ đứng từ A chúng ta có thể kết nối ssh lên server X thông qua socket này như sau:
ssh username@127.0.0.1 -p 2222
Trên thực tế, một trường hợp rất thường xuyên áp dụng “local port forwarding” đó là Mysql tunnelling. Ví dụ từ Desktop A, bạn có thể ssh lên Server B, trên B chạy Mysql ở cổng 3306 và chỉ chấp nhận kết nối từ local. Vậy một cách đơn giản, để kết nối Mysql trên B từ A, đó là dùng port forwarding
ssh -L 3307:localhost:3306 username@172.168.0.111
Sau khi có kết nối ssh, tiếp theo là dùng lệnh mysql trên A để kết nối đến dịch vụ Mysql trên server B
mysql -h 127.0.0.1 -P 3307 -uroot -p
Giả sử bạn đồng thời muốn mở socket trên A để các máy khác trong cùng mạng LAN có thể kết nối được đến Mysql trên B. Chỉ cần thêm tuỳ “-g” trong lệnh ssh, như sau:
ssh -L 3307:localhost:3306 -g username@172.168.0.111
Bây giờ trên máy A2 trong mạng LAN, có IP 192.168.1.102, bạn kết nối đến Mysql trên B thông qua A như sau:
ssh -h 192.168.1.101 -P 3307 -uroot -p

2. Remote port forwarding

ssh2_rpf
Mở kết nối ssh tới ssh server với tuỳ chọn “-R port:host:hostport” trong đó
  • port là cổng ở phía ssh server được chỉ định để mở socket.
  • host:hostport là socket đích muốn tới (nhìn từ phía ssh client).
Về mặt logic “remote port forwarding” hoàn toàn tương tự với “local port forwarding” chỉ thay việc kết nối đi từ ssh client bằng đi từ phía ssh server, thông qua ssh client để đến server/host đích.
Trên thực tế “remote port forwarding” ít được dùng hơn “local port forwarding” cũng như “dynamic port forwarding”, một trong những trường hợp ứng dụng của “remote port forwarding” là “SSH ngược”.
Giả định:
  • Desktop của bạn A (phía ssh client) có IP 192.168.1.101, từ B không thể ping/kết nối tới A.
  • Server trung gian B (phía ssh server) có IP 172.16.0.111, từ A có thể ssh tới B.
  • Server B2 cùng dải mạng với ssh server B có IP 172.16.0.112
Mục đích: cho phép B ssh ngược về A. Có thể mở rộng thêm bằng việc cho phép B2 ssh ngược về A thông qua B.
Thực hiện điều này đơn giản bằng các mở một kết nối ssh từ A lên B với tuỳ chọn “-R”, như sau:
ssh -R 2222:localhost:22 username@172.16.0.111
Ở trên B, chúng ta có thể thấy một socket được mở ở cổng 2222
[root@B:~]# netstat -lntp | grep 2222
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 29375/10
Thông qua socket này, từ B chúng ta có thể ssh ngược về A, như sau:
ssh root@localhost -p 2222
Để B2 cũng có thể kết nối ssh tới A thông qua B, thì trên cấu hình /etc/ssh/sshd_config của B phải thêm
GatewayPorts yes
Sau khi thay đổi cấu hình ssh, chúng ta cần khởi động lại dịch vụ ssh và khởi tạo lại kết nối.
Bây giờ trên B2 chúng ta có thể kết nối tới A, như sau:
[root@B2:~]# ssh root@172.16.0.111 -p 2222

3. Dynamic port forwarding

Mở kết nối ssh tới ssh server với tuỳ chọn “-D port” với port ở đây là cổng ở phía ssh client được bật lên như socket của SOCKS server. Thông qua SOCKS này chúng ta có thể đi tới bất kỳ đâu mà ở phía ứng dụng đích đó chỉ biết chúng ta đi ra từ server B, chứ không hề biết thực sự kết nối được khởi tạo từ A.
ssh -D 2222 username@172.16.0.111
Sau khi tạo xong kết nối, chúng ta có thể sử dụng SOCKS này để ra Internet an toàn, ví dụ có thể cấu hình vào Firefox như hình bên dưới.
firefox_over_ssh_socks
Để kiểm tra việc cấu hình và SOCKS có hoạt động đúng, chúng ta có thể đi tới địa chỉ http://myip.wikilinux.vn để kiểm tra IP ra Internet.