Trong quá trình cài đặt và sử dụng OpenSSH, tác giả nhận thấy có một số vấn đề bảo mật trong OpenSSH có thể phát triển nhằm tăng cƣờng tính an toàn và bảo mật cho ứng dụng SSH.
Phiên bản OpenSSH mới nhất hiện nay là 5.9p1 công bố vào tháng 9 năm 2011. Tuy nhiên, phiên bản này khoá sinh ra vẫn sử dụng chuẩn FIPS PUB 186-2 (Federal Information Processing Standards PUBlication). FIPS PUB 186-2 do Viện tiêu chuẩn và công nghệ quốc gia hoa kỳ (NIST) đƣa ra vào tháng 1 năm 2000. Tiêu chuẩn này quy định một bộ các thuật toán sử dụng để tạo ra chữ ký số. Cụ thể Openssh-5.9p1 hiện tại sử dụng khoá RSA, DSA va ECDSA nhƣ sau:
Khoá RSA có chiều dài mặc định 2048 bit, chiều dài khoá tối thiểu 768 bit. Khoá DSA chiều dài khoá cố định 1024 bit.
Khoá ECDSA cho phép sinh khóa với chiều dài 256 bit, 384 bit và 521 bít, chiều dài khoá mặc định 256 bits.
Hình 3.39: Chiều dài khóa sinh ra trong bản OpenSSH-5.9p1
Tuy nhiên hiện nay chuẩn FIPS PUB 186-2 đã đƣợc thay thế bằng các quy định trong GO-ITS 25.12 (Government of Ontario Information & Technology Standard) ra đời tháng 10 năm 2008 và chuẩn FIPS PUB 186-3 ra đời tháng 6 năm 2009. Trong đó khuyến cáo.
Với khoá RSA độ dài khoá tổi thiểu 2048 bits, nên dùng 3072 bits. Khoá DSA nên dùng khoá 2048 bít hoặc 3072 bits.
Trên cơ sở đó, tác giả đã nghiên cứu phát triển mã nguồn mở chƣơng trình ssh- keygen trong bộ công cụ OpenSSH-5.9p1 từ chuẩn FIPS PUB 186-2 lên FIPS PUB 186-3 và GO-ITS 25.12 cụ thể nhƣ sau:
Thay đổi chiều dài khoá sinh ra:
Khoá RSA cho phép sinh khóa có chiều dài mặc định 3072 bit, chiều dài khóa nhỏ nhất sinh ra là 2048 bit.
Khoá DSA cho phép sinh khoá có chiều dài 1024 bit hoặc 2048 bit, mặc định sinh khoá 2048 bit.
Khoá ECDSA sinh khóa cố định có chiều dài 521 bit.
Để phát triển mã nguồn mở Openssh, tác giả sử dụng công cụ hỗ trợ lập trình CodeLite. CodeLite cũng là một phần mềm nguồn mở, sử dụng để lập trình với ngôn ngữ C/C++.
Hình 3.40 : Công cụ hỗ trợ lập trình CodeLite.
Để thay đổi chiều dài khóa sinh ra cần chỉnh sửa mã nguồn trong các file ssh- keygen.c, key.c, openbsd-compat/openssl-compat.h, ssh-keygen.1, ssh-keygen.0…
Định nghĩa chiều dài khóa sinh ra trong trƣờng hợp mặc định trong file ssh- keygen.c (khi ngƣời dùng không chỉ rõ chiều dài khóa):
#define DEFAULT_BITS 3072
#define DEFAULT_BITS_DSA 2048
#define DEFAULT_BITS_ECDSA 521
Chỉnh sửa thủ tục kiểm tra chiều dài khóa sinh ra theo chuẩn mới xây dựng
static voidtype_bits_valid(int type, u_int32_t *bitsp)
{
u_int maxbits;
if (type == KEY_UNSPEC) {
fprintf(stderr, "unknown key type %s\n", key_type_name); exit(1);
}
if (*bitsp == 0) {
if (type == KEY_DSA)
*bitsp = DEFAULT_BITS_DSA; else if (type == KEY_ECDSA)
*bitsp = DEFAULT_BITS_ECDSA; else
*bitsp = DEFAULT_BITS; }
maxbits = (type == KEY_DSA) ?
OPENSSL_DSA_MAX_MODULUS_BITS:OPENSSL_RSA_MAX_MODULUS_BITS; if (*bitsp > maxbits)
{
fprintf(stderr, "key bits exceeds maximum %d\n",
maxbits);
exit(1); }
if (type == KEY_DSA) {
if ((*bitsp != 1024) && ( *bitsp != 2048)) fatal("DSA keys must be 1024 or 2048 bits"); }
else if (type != KEY_ECDSA && *bitsp < 2048) fatal("Key must at least be 2048 bits");
else if (type == KEY_ECDSA && key_ecdsa_bits_to_nid(*bitsp) == -1)
fatal("Invalid ECDSA key length - valid lengths are 521 bits");
}
Xây dựng hàm xác định NID của khóa ECDSA có chiều dài 521 bit trong file key.c int key_ecdsa_bits_to_nid(int bits) { if (bits==521) { return NID_secp521r1; } else { return -1; } }
Thay đổi tham số quy định chiều dài khóa cực đại trong file openbsd-compat/openssl- compat.h nhƣ sau: #ifndef OPENSSL_DSA_MAX_MODULUS_BITS # define OPENSSL_DSA_MAX_MODULUS_BITS 2048 #endif #ifndef OPENSSL_RSA_MAX_MODULUS_BITS # define OPENSSL_RSA_MAX_MODULUS_BITS 4096 #endif
Sau thời gian nghiên cứu mã nguồn và lập trình phát triển nâng cấp lên chuẩn FIPS PUB 186-3 và GO-ITS 25.12 đến nay chƣơng trình đã hoàn thiện. Thay đổi quá trình sinh khoá RSA, DSA và ECDSA nhƣ đã trình bày ở trên. Dƣới đây trình bày một vài kết quả khi tạo khoá bằng chƣơng trình đƣợc phát triển.
Hình 3.41: Chiều dài khóa của bản Openssh nâng cấp
Nếu sử dụng phiên bản 5.9p1 để sinh khoá DSA, chỉ cho phép sinh khoá có chiều dài cố định 1024 bits nếu sinh khoá có chiều dài khác, chẳng hạn nhƣ 2048 bits chƣơng trình sẽ thông báo lỗi “DSA keys must be 1024 bits” và không cho phép sinh khoá nhƣ hình dƣới đây:
Hình 3.42: Lỗi khi sinh khoác DSA có chiều khác 1024 bits
Sau khi cài đặt chƣơng trình đã chỉnh sửa, việc sinh khoá DSA với chiều dài 2048 bits đƣợc thực hiện rất tốt. Hình dƣới đây minh hoạ sinh khoá DSA có chiều dài 2048 bits, khoá đƣợc lƣu vào file key_dsa_2048.
Hình 3.43: Sinh khoá dsa 2048 bits trong bản nâng cấp
Sinh khoá thành công sẽ tạo ra cặp khoá Private và Public nhƣ sau: Khoá Private:
Hình 3.44: Khóa private DSA 2048 bits trong file key_dsa_2048
Và khóa Public:
Hình 3.45: Khóa public DSA 2048 bits trong file key_dsa_2048
Chƣơng trình nâng cấp cho phép sinh khoá với chiều dài 1024 hoặc 2048bits. Nếu sinh khoá có chiều dài khác giá trị trên chƣơng trình sẽ thông báo lỗi nhƣ hình dƣới.
Hình 3.46: Thông báo lỗi khi sinh khóa DSA
Ngoài kiểm tra sinh khoá với DSA, có thể thực hiện việc sinh khoá RSA và ECDSA để thấy sự thay đổi trong bản 5.9p1 và bản sau khi đã nâng cấp.