لاگین کردن با ssh key

بدون حرف‌های اولیه و مقدمه چینی، چیزی که قراره بخونیم اینه :  برای اینکه جلوی حمله Brute-force رو سرورمون رو بگیریم از روش احراز هویت یا لاگین کردن با SSH Key استفاده می‌کنیم.

در مورد حمله Brute-force خیلی ساده میشه گفت تعداد سعی‌های خیلی زیادی که برای شکستن پسورد و وارد شدن به سیستم/سرور/ … انجام میشه رو میگن بروت فورس که با نرم‌افزارهای قدرتمندی تو زمان کم پسوردهای مختلف حالا با استفاده از دیکشنری یا … حدس زده میشه و بالاخره شاید یکیش گرفت و وارد میشن.

اوکی و برای اینکه جلوی این نوع حمله رو بگیریم میایم به جای احراز هویت با پسورد از احراز هویت با SSH Key استفاه می‌کنیم. به این معنی که یه جفت کلید میسازیم، public key رو روی سرور می ذاریم و Private رو روی کامپیوتر خودمون. و از این به بعد فقط با همین کامپیوتری که کلید خصوصی روش هست می‌تونیم وارد سرور بشیم. و خب می‌تونیم از کلید خصوصی‌مون هم با phrase محافظت کنیم.

یه جفت کلید rsa میسازیم

با استفاده از کامند زیر یه جفت کلید میسازیم، حالا چه بهتر که روی همون کامپیوتری باشه که قراره با سرور مچ باشه.

ssh-keygen -t rsa

ازمون می‌پرسه کجا ذخیره بشه :

Enter file in which to save the key (/root/.ssh/id_rsa):

حالا اینتر میزنیم که تو همین روت ذخیره کن و یا بهش آدرس می‌دیم.

بعد ازمون می‌خواد که اگه می‌خوایم با یه phrase از private key‌ مون محافظت کنیم. اینتر رو بزنیم رد میشه و اگر نه یه عبارتی رو مینویسیم. البته که بهتره یه passphrase  وارد کنیم چون اگه کلید خصوصی ‌مون دست کسی افتاد بدون این phrase نمیتونه ازش استفاده کنه.

Enter passphrase (empty for no passphrase):

و دست آخر کلید رو میسازه. نتیجه چیزی که تو Bash میبینین شبیه این هست :

ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/demo/.ssh/id_rsa.
Your public key has been saved in /home/demo/.ssh/id_rsa.pub.
The key fingerprint is:
4a:dd:0a:c6:35:4e:3f:ed:27:38:8c:74:44:4d:93:67 demo@a
The key's randomart image is:
+--[ RSA 2048]----+
|          .oo.   |
|         .  o.E  |
|        + .  o   |
|     . = = .     |
|      = S = .    |
|     o + = +     |
|      . o + o .  |
|           . o   |
|                 |
+-----------------+

خب الان کلید عمومی‌مون تو آدرس /home/demo/.ssh/id_rsa.pub و کلید خصوصی‌مون تو آدرس /home/demo/.ssh/id_rsa هستش. آدرس‌ها طبق مثال بالا این میشه شما هر جایی می‌تونین ذخیره کنین.

حالا باید کلید عمومی رو روی سرور کپی کنیم

دو راه داریم یا می‌تونیم از کامند ssh-copy-id استفاده کنیم :

ssh-copy-id [email protected]

که user و Id سرورتون رو میذارین. این کامند کلید عمومی رو از روی ماشین لوکال رو authorized_keys سرور کپی میکنه. اگه چند تا کلید داشته باشیم با آرگومان  -i identity_file کلید مورد نظرمونو مشخص می‌کنیم.

روش دوم استفاده از کامند زیره

cat ~/.ssh/id_rsa.pub | ssh [email protected] "mkdir -p ~/.ssh && cat >>  ~/.ssh/authorized_keys"

این کامند میاد از فایل id_rsa.pub که همون کلید عمومي مون هست با cat یه پرینت میگیره .ssh میزنه به سرور و میگه یه پوشه درست کن و اون چیزی که پرینت گرفتی رو بدون اینکه نشون بدی به فایل authorized_keys  اضافه کن.

واز هر راهی که بریم در نهایت یه چیزی شبیه این میبینیم :

The authenticity of host '12.34.56.78 (12.34.56.78)' can't be established.
RSA key fingerprint is b1:2d:33:67:ce:35:4d:5f:f3:a8:cd:c0:c4:48:86:12.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '12.34.56.78' (RSA) to the list of known hosts.
[email protected]'s password: 
Now try logging into the machine, with "ssh '[email protected]'", and check in:

  ~/.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

حالا اگه ssh بزنین به سرورتون دیگه ازتون پسورد نمی‌خواد و لاگین میشین. (همون کامپیوتری که کلید خصوصی رو داشت).

حالا می‌تونیم با یه ادیت ساده تو فایل کانفیگ ssh بگیم کلن پسورد روت رو ورداره، یعنی کسی با پسورد نتونه وارد بشه. با دستور زیر فایل sshd_config رو باز می‌کنیم :

vi /etc/ssh/sshd_config

خطی که PermitRootLogin رو نوشته پیدا می‌کنیم و به صورت زیر تغییر می‌دیم، تا مطمئن شیم که کاربرایی می‌تونن وارد سرور بشن که ssh key داشته باشن. (اگه کامنت بود از کامنت درش میاریم)

PermitRootLogin without-password

برای اعمال تغییراتمون سرویس ssh رو ریستارت می‌کنیم :

/etc/init.d/sshd restart