Anh tạo user cho em rồi, vào đổi password đi nhé!

Dự án hiện tại của tôi đang dùng 26 con Ubuntu server lớn nhỏ, và tất nhiên không phải ai trong đội phát triển cũng có quyền truy cập vào tất cả chúng. Tôi có quyền đó, đồng nghĩa với việc tôi phải đảm nhận nhiệm vụ quản lý quyền truy cập của các thành viên trong đội tới từng server một. Gần đây việc cấp quyền truy cập diễn ra thường xuyên hơn, khiến tôi cứ phải lặp đi lặp lại những công việc khá nhàm chán.

Để cho phép một người có thể truy cập (ssh) vào một server, tất nhiên tôi phải tạo user cho người đó trên server tương ứng. Đầu tiên là phải hỏi SSH public key. Việc này thì cũng không mệt mỏi cho lắm, tôi có note lại để đỡ phải hỏi lại nhiều lần. Sau đó tôi phải gõ một loạt các lệnh như tạo user, tạo thư mục .ssh, phân quyền... Mỗi lần là một chuỗi các copy paste nhàm chán (tôi không có năng lực nhớ được những thứ phức tạp như thế).

Và một vấn đề tôi cho là phiền phức nhất, như cái tiêu đề tôi đã đặt, đó là mỗi lần tôi tạo xong một user, tôi lại phải đổi password cho user đó thành "changeme" và yêu cầu thành viên được cấp quyền thay password của mình vào. Trăm lần như một, tốn thời gian của tôi thì không sao, nhưng tốn thời gian của đội thì rõ là có vấn đề!

Giải pháp

Việc tìm giải pháp không tốn quá nhiều thời gian, vì thực sự nó không có gì khó. Hơn nữa tôi cũng đã từng làm việc với các sư phụ infra (ở công ty tôi người ta gọi là các sư phụ hạ tầng) nhiều nên cũng học hỏi được chút đỉnh. Giải pháp ở đây là thay vì note lại SSH keys, note lại các lệnh để copy paste thì tôi viết vài cái bash script cho từng thành viên một. Lúc cần tạo cho ai thì lên server chạy file tương ứng là xong. Easy enough?

Ví dụ tạo user tên là bs90 thì file bash script đó sẽ trông như sau:

#!/bin/bash
useradd -d /home/bs90 -s /bin/bash -m bs90 -G admin
mkdir /home/bs90/.ssh
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUCPMsp8q/h/JtCqFH...itistoolong...K1iIj [email protected]' > /home/bs90/.ssh/authorized_keys
chown -R bs90:bs90 /home/bs90/.ssh
chmod 700 -R /home/bs90/.ssh
chmod 600 -R /home/bs90/.ssh/*
sed -i '/^bs90:.*$/d' /etc/shadow
echo 'bs90::$6$F2...hidden...Ux1.:16728:0:99999:7:::' >> /etc/shadow

Giải thích chi tiết

Tạo user

useradd -d /home/bs90 -s /bin/bash -m bs90 -G admin

Tạo user tên là bs90, có thư mục gốc là /home/bs90 và thuộc group tên là admin. Bạn có thể thiết lập ID mong muốn, hoặc đổi group khác cho user, useradd có thể làm được rất nhiều điều. Kiến thức cơ bản, chạy man useradd để biết thêm chi tiết.

Tạo authorized_keys

mkdir /home/bs90/.ssh
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUCPMsp8q/h/JtCqFH...itistoolong...K1iIj [email protected]' > /home/bs90/.ssh/authorized_keys

Tạo thư mục .ssh trong thư mục gốc của user, sau đó add public key vào file authorized_keys trong thư mục đó. Điều này cho phép máy tính có public key tương ứng (tất nhiên là phải có cả private key nữa) truy cập vào server. Như đã nói ở trên, thay vì phải note public key ở chỗ khác, đây là chỗ note thông minh hơn nhiều.

Phân quyền

chown -R bs90:bs90 /home/bs90/.ssh
chmod 700 -R /home/bs90/.ssh
chmod 600 -R /home/bs90/.ssh/*

Có một số quy định về quyền của thư mục .ssh và các file phía bên trong. Không biết các bạn đã gặp thông báo "ssh permissions are too open" bao giờ chưa 😄 Nói nghe to tát vậy thôi, 3 dòng bên trên làm hết cho tôi rồi.

Shadow - Điều kỳ diệu

Có một file nằm ở /etc/shadow, file này chứa password của tất cả các user, tất nhiên là dưới dạng mã hoá. Như các bạn thấy ở bên trên, shadow của user bs90 có dạng như sau:

bs90::$6$F2...hidden...Ux1.:16728:0:99999:7:::

Theo tôi biết thì chuỗi này có thể chứa những 8 loại thông tin: username, password đã được mã hoá, lần đổi password cuối cùng, bla bla. Nếu bạn là một chuyên gia copy paste như tôi thì cũng không cần quan tâm lắm. Cái tôi cần là sau lần đầu tiên tôi tạo user cho một thành viên, tôi sẽ có dòng shadow của người đó. và từ lần sau, người ấy không cần phải gõ chuỗi "changeme" đáng ghét và đổi password nữa.

sed -i '/^bs90:.*$/d' /etc/shadow
echo 'bs90::$6$F2...hidden...Ux1.:16728:0:99999:7:::' >> /etc/shadow

Mỗi user tạo ra sẽ có ngay một dòng shadow mặc định. sed là stream editor, lệnh ở dòng bên trên với option -i (--in-place) giúp cho hệ thống hiểu là bây giờ tôi sẽ sửa ở dòng này, file này đấy nhé. Dòng tiếp theo thì quá dễ hiểu, điền shadow đã có vào file thôi. Nếu không có dòng trên thì sẽ có hai dòng shadow cho một user, và tôi cũng không biết trường hợp đó thì có chuyện gì xảy ra nữa.

Và thế là xong, muốn có quyền truy cập vào một server mới ư, chờ anh 5 giây nhé (yeah)

Hoặc chính tôi muốn có quyền truy cập vào đâu đó, đưa cho nhà chức trách file bash của tôi là xong.

Kết luận

Đôi lúc trong cuộc sống bạn gặp phải những việc mà bạn phải làm đi làm lại nhiều lần. Nếu việc làm đi làm lại khiến bạn sung sướng hạnh phúc thì cứ tiếp tục, còn nếu nó khiến bạn chán nản thì tốt nhất bạn nên nghĩ ra một hay nhiều giải pháp để thoát khỏi tình trạng đáng sợ đó. Chúc các bạn thành công!