Monday, January 3, 2011

Truy cập MySQL Server từ xa thông qua SSH

MySQL là một hệ quản trị cơ sở dữ liệu thường dùng trong các phiên bản khác nhau của Linux, nó có một đặc điểm là mặc định nó chỉ mở các cổng địa phương vì lí do bảo mật.

Nếu bạn muốn truy cập đến cơ sở dữ liệu của bạn từ một công cụ máy khác như MySQL Query Browser, thì bình thường bạn phải mở truy cập từ địa chỉ IP local của bạn…nhưng nó thật không an toàn.

Giải pháp thay thế ở đây là, chúng ta sẽ sử dụng port-forwarding thông qua một SSH tunnel, vì như thế MySQL client của bạn sẽ nghĩ rằng nó đang kết nối đến máy localhost, nhưng thực ra nó đang kết nối đến một máy chủ khác thông qua tunnel (đường hầm).

Nếu bạn dùng câu lệnh ssh, câu lệnh đó sẽ giống như dưới đây. (Bạn có thể làm việc này sử dụng chế độ đồ họa thông qua Putty hoặc SecureCRT nếu bạn muốn)
ssh –L 3306:localhost:3306 geek@webserver.com
Cú pháp của lệnh ssh: ssh –L hostname @. Chúng ta sử dụng locahost như là hostname vì chúng ta truy cập trực tiếp đến mysql server ở xa thông qua ssh. Bạn cũng có thể dùng kĩ thuật này đến port-forward thông qua một ssh server đến một server khác.

Nếu bạn đã có mysql chạy trên hệ thống thì bạn có thể sử dụng một cổng địa phương khác cho port-forwarding, và thiết đặt công cụ máy khách của bạn truy cập đến MySQL trên một cổng khác.




Một khi bạn đã có ssh tunnel chạy, bạn có thể mở MySQL Query Browser và điền vào chi tiết server ở xa của bạn, dùng localhost như server host, và chọn cổng mà bạn muốn dùng.

Khi bạn dùng phương pháp này, bạn sẽ không cần dùng đến phpmyadmin hoặc dòng lệnh nữa.

Giám sát hệ thống Linux với netstat




Netstat là một công cụ hữu ích của Linux cho phép bạn kiểm tra những dịch vào nào đang kết nối đến hệ thống của bạn. Nó rất hữu ích trong việc phân tích cái gì đang xảy ra trên hệ thống của bạn khi bạn cố gắng ngăn chặn một cuộc tấn công nhằm vào nó. Bạn có thể tìm thêm thông tin như có bao nhiêu kết nối được tạo ra trên một cổng, địa chỉ IP nào đang kết nối đến và nhiều thông tin khác nữa. Netstat đi kèm trong hầu hết các bản phân phối của Linux vì vậy nó nên được cài đặt trên hệ thống của bạn.

Khởi động một shell terminal trên hệ thống của bạn và chạy câu lệnh sau:
# netstat -ant

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 ::ffff:192.168.1.19:80 ::ffff:192.168.1.240:63049 TIME_WAIT
tcp 0 0 ::ffff:192.168.0.19:80 ::ffff:192.168.1.240:62793 TIME_WAIT
tcp 0 0 ::ffff:192.168.1.19:80 ::ffff:192.168.1.240:62795 TIME_WAIT

Những thông tin xuất ra hầu hết đều rất dài. Như ở trên là một ví dụ về thông tin xuất ra. Như bạn có thể thấy trong dữ liệu ở trên có một kết nối được tạo ra từ 192.168.1.240 đến máy tính của chúng ta ở cổng 80 sử dụng giao thức TCP và kết nối đang ở trạng thái TIME_WAIT. Những thông tin xuất ra này sẽ cho bạn biết thông tin về tất cả các cổng trên hệ thống của bạn, không chỉ riêng cổng 80.

Điều đầu tiên bạn cần nhận thức là những thông tin này rất lớn nhưng không được dùng nhiều. Vì vậy chúng ta cần phải tổ chức lại nó. Ở đây có một vài thủ thuật chúng ta dùng để phân tích trạng thái tự nhiên của kết nối được tạo ra bởi hệ thống của chúng ta. Điều đầu tiên chúng ta cần làm là suy nghĩ xem những dịch vụ nào mà chúng ta muốn phân tích. Thông thường, cổng 80 là cổng mặc định cho web server, và cổng 3306 là cổng mặc định của MySQL. Vì vậy chúng ta sẽ dùng lệnh sau để xem cái gì đang diễn ra trên cổng 80:

# netstat -ant | grep 80
Bây giờ chúng ta sẽ có một danh sách các kết nối, nhỏ hơn lần trước, nhưng vẫn quá lớn để có thể nắm bắt hết. Vì vậy chúng ta sẽ dùng thêm lệnh "Wc -l" để đếm số dòng xuất ra để xem có bao nhiêu kết nối đến cổng 80:

# netstat -ant | grep 80 | wc -l

625
# netstat -ant | grep 3306 | wc -l

61

Bây giờ nếu muốn có một bức tranh toàn cảnh về những gì đang diễn ra trên hệ thống về các kết nối, chúng ta làm như sau:

# netstat -ant | awk '{print $6}' | sort | uniq -c | sort -n

1 established)
1 Foreign
4 FIN_WAIT2
8 LISTEN
16 CLOSE_WAIT
134 ESTABLISHED
409 TIME_WAIT

Như trên nói cho chúng ta biết có bao nhiêu loại trạng thái kết nối và số kết nối của mỗi trạng thái đó. Chúng ta cũng có thể chạy một câu lệnh tương tự để xem trạng thái kết nối được tạo ra bởi webserver như sau:

# netstat -ant | grep 80 | awk '{print $6}' | sort | uniq -c | sort -n

1 FIN_WAIT1
4 LISTEN
6 FIN_WAIT2
17 CLOSE_WAIT
94 ESTABLISHED
534 TIME_WAIT

Bạn có thể làm được nhiều việc phức tạp hơn bằng cách sử dụng lệnh Netstat kết hợp với các câu lệnh khác của Linux. Có thể rất hữu ích khi biết rõ một số thủ thuật của việc sử dụng Netstat, đặc biệt khi bạn đối mặt với một cuộc tấn công nhắm vào hệ thống của bạn.