SSD Nodes Learn Hosting plans →
Mwongozo Matt ConnorNa Matt Connor · Imeboreshwa 2026-08-07

Jinsi ya kusimamia funguo za SSH kwa usalama

Jifunze kusimamia funguo za SSH kwa kutumia ed25519, kusanidi faili ya config, na kurekebisha ruhusa za 0600 zinazohitajika na sshd ili kuzuia makosa ya ufikiaji kwenye seva.

Jinsi funguo za SSH zinavyofanya kazi

Ufunguo wa SSH ni jozi ya faili: ufunguo wa kibinafsi (private key) unaobaki kwenye kifaa chako na ufunguo wa hadhara (public key) unaouweka kwenye kila seva unayotaka kuingia. Unapounganisha, seva hutumia ufunguo wa hadhara kutuma changamoto ambayo ufunguo wa kibinafsi unaolingana pekee ndio unaoweza kuijibu. Ufunguo wa kibinafsi hauwahi kutoka kwenye kifaa chako, kwa hivyo hakuna siri inayopita kwenye mtandao, na seva iliyovamiwa haina kitu chochote chenye thamani cha kuibwa. Hii ndiyo sababu funguo ni bora kuliko nywila. Kusimamia funguo za SSH vizuri kunategemea tabia nne: ufunguo mmoja kwa kila kifaa, ruhusa za faili zinazohitajika na sshd, faili ya ~/.ssh/config ili uache kuandika chaguzi kila mara, na kujua jinsi ya kuondoa ufunguo siku kompyuta yako ya mkononi inapopotea.

Mwongozo huu unashughulikia kila tabia kwenye Ubuntu 24.04, ingawa karibu kila kitu hapa kinatumika kwa seva yoyote ya Linux na toleo lolote la hivi karibuni la OpenSSH.

Hoja moja ya msamiati kabla hatujaanza, kwa sababu inazuia makosa ya kweli. Ufunguo wa hadhara si siri. Unaweza kuubandika kwenye tiketi, kuutuma kwa barua pepe, au kuuchapisha, na hakuna mtu anayeweza kuingia nao. Ufunguo wa kibinafsi ndio siri. Mtu yeyote anayenakili faili hiyo, na kujua nenosiri lake ikiwa analo, anakuwa wewe kwa kadiri ya seva zako zinavyohusika.

Tengeneza key: ed25519 ndiyo chaguo-msingi sahihi

Kwenye kompyuta yako binafsi, siyo kwenye seva, endesha:

ssh-keygen -t ed25519 -C "laptop"

-t ed25519 huchagua aina ya key. Ed25519 ndiyo chaguo-msingi la kisasa: key hizi ni fupi, za haraka, na zinaungwa mkono na kila toleo la OpenSSH tangu 2014. Tumia ssh-keygen -t rsa -b 4096 tu pale unapopaswa kuwasiliana na kifaa cha zamani kisichotambua ed25519. -C "laptop" huweka maoni (comment). Maoni haya hayana kazi yoyote ya kikriptografia, lakini ndiyo njia utakayotumia kutambua key hii kwenye faili la authorized_keys la seva baada ya miaka miwili, kwa hiyo ipe jina la kifaa ambacho key hiyo imehifadhiwa.

ssh-keygen huuliza mahali pa kuhifadhi key. Kubali chaguo-msingi, ~/.ssh/id_ed25519. Kisha itaomba passphrase. Weka moja; sehemu ya passphrase hapa chini inaeleza kwa nini haikugharimu chochote katika matumizi ya kila siku. Utapata faili mbili: ~/.ssh/id_ed25519 ni private key, na ~/.ssh/id_ed25519.pub ni public key. Angalia nusu ya public:

cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF3k2s0vQx7GdKQhX1yBz... laptop

Hii ni mstari mmoja: aina ya key, maudhui ya key, na maoni yako. Mstari huo ndio unaopaswa kuwekwa kwenye seva zako.

Ufunguo mmoja kwa kila kifaa, si mmoja kwa kila seva

Swali ambalo kila mtu huuliza kwanza: je, ninahitaji ufunguo mpya kwa kila seva? Hapana. Tengeneza ufunguo mmoja kwa kila kifaa unachotumia kuandika, na uweke ufunguo huo wa umma (public key) kwenye kila seva ambayo kifaa hicho kinahitaji kufikia. Ufunguo huu hutambulisha kifaa husika. Faili ya authorized_keys kwenye kila seva ndiyo orodha ya vifaa vinavyoruhusiwa kuingia.

Huu ndio mtindo unaoweza kukua (scale), na njia mbadala hushindwa kwa namna zinazotabirika. Ufunguo mmoja kwa kila seva inamaanisha kuwa kompyuta ya mkononi yenye seva ishirini itabeba funguo binafsi (private keys) ishirini, na utapoteza uwezo wa kutofautisha ipi ni ipi. Ufunguo mmoja unaoshirikiwa na vifaa vyako vyote ni mbaya zaidi: kompyuta ya mkononi ikiibwa, huwezi kuifuta (revoke) bila pia kuifungia kompyuta yako ya mezani, kwa sababu zote zinashikilia ufunguo binafsi uleule. Hivyo, lazima ubadilishe ufunguo kila mahali na kuusambaza upya kwenye kila kifaa kwa wakati mmoja.

Kwa kutumia ufunguo mmoja kwa kila kifaa, kompyuta ya mkononi iliyopotea inakugharimu mstari mmoja tu kwa kila seva: futa mstari wa kompyuta hiyo kutoka authorized_keys, na kila kifaa kingine kitaendelea kufanya kazi. Maoni (comment) unayoweka kwa kutumia -C ndiyo yanayofanya mstari huo kuwa rahisi kupatikana.

Kanuni iliyo nyuma ya mtindo huu: ufunguo binafsi hutengenezwa kwenye kifaa na hufia kwenye kifaa hicho. Usiwahi kunakili ufunguo binafsi kwenda kwenye mashine ya pili, na usiwahi kuupakia kwenye seva. Kifaa kipya kinapohitaji kufikia seva, tengeneza ufunguo mpya kwenye kifaa hicho.

Weka public key kwenye seva

Njia rahisi ni ssh-copy-id, ambayo huja na OpenSSH:

ssh-copy-id matt@10.0.0.10

Inaingia kwa kutumia njia yoyote inayofanya kazi, kwa kawaida nenosiri, inaongeza public key yako kwenye ~/.ssh/authorized_keys iliyo kwenye seva, na inatengeneza saraka na faili hiyo kwa ruhusa sahihi ikiwa hazipo. Ijaribu kwa kufungua session mpya ya SSH: seva inapaswa kukuacha uingie bila kuuliza nenosiri la akaunti. Ikiwa key yako ina passphrase, mashine yako inaweza kukuuliza hiyo badala yake; kidokezo hicho ni cha ndani na si nenosiri la seva.

Wakati kuingia kwa nenosiri kumeshazimwa, ssh-copy-id haiwezi kuingia, kwa hivyo unaongeza mstari huo kwa mkono. Ingia kupitia session inayofanya kazi, au kupitia web console ya mtoa huduma wako, na uendeshe amri hii kwenye seva:

mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF3k2s0vQx7GdKQhX1yBz... laptop" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Bandika public key yako halisi ndani ya alama za kunukuu, mstari mzima mmoja kutoka id_ed25519.pub. authorized_keys ni public key moja kwa kila mstari, na hiyo ndiyo hifadhidata nzima ya ufikiaji: kuongeza kifaa ni kuongeza mstari, na kufuta kifaa ni kufuta mstari mmoja. Kwenye seva mpya, hatua hii inafanyika ndani ya dakika 10 za kwanza kwenye VPS mpya, kabla tu ya kuzima uingiaji kwa nenosiri.

Ruhusa zinazosababisha hitilafu ya kuingia kwa kutumia key

Hii ndiyo njia ya kawaida zaidi ya kuingia kwa kutumia key kushindwa, na inashindwa kimyakimya kwa upande wa client. StrictModes yes huendeshwa kwa chaguo-msingi kwenye Ubuntu 24.04, kumaanisha kuwa inakataa kutumia faili ya authorized_keys ambayo watumiaji wengine wanaweza kuihariri. Ikiwa faili hiyo, saraka ya ~/.ssh, au saraka yako ya nyumbani inaweza kuandikwa na mtu yeyote isipokuwa wewe, C3d hupuuza key yako na kurudi kwenye kuomba nenosiri, bila maelezo yoyote kwa client. (OpenSSH ya Ubuntu inaruhusu kisa kimoja tu: faili inayoweza kuandikwa na kundi lako binafsi, ambalo hakuna mtu mwingine aliyemo. Usitegemee hili; tumia modes zilizo hapa chini.) Sababu huonekana tu kwenye log ya seva:

sudo grep 'Authentication refused' /var/log/auth.log

Kwenye image ndogo isiyo na rsyslog hakuna auth.log; mstari huo huo hupatikana kwenye journal: sudo journalctl -u ssh | grep 'Authentication refused'.

Authentication refused: bad ownership or modes for file /home/matt/.ssh/authorized_keys

Suluhisho ni mabadiliko mawili ya ruhusa na ukaguzi wa umiliki, yanayotekelezwa kwenye seva kama mtumiaji husika:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R matt:matt ~/.ssh

Kanuni ya kukumbuka: 700 kwenye saraka ya .ssh, 600 kwenye kila kitu kilichomo ndani yake. Namba hizo hizo hutumika kwenye kompyuta yako mwenyewe, kwa sababu client pia hukagua. Private key inayoweza kusomwa na watumiaji wengine humfanya ssh kukataa key hiyo moja kwa moja, na wakati huu hitilafu huonekana wazi:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/matt/.ssh/id_ed25519' are too open.

chmod 600 ~/.ssh/id_ed25519 hutatua tatizo hili.

~/.ssh/config: acha kuandika chaguzi mara kwa mara

Faili la ~/.ssh/config kwenye kompyuta yako hukupa kila seva jina fupi na kukumbuka chaguzi unazoendelea kuandika. Litengeneze kwa ruhusa za 600 na uongeze kizuizi cha Host kwa kila seva:

Host web1
    HostName 10.0.0.10
    User matt
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

Host db1
    HostName 10.0.0.11
    User matt
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

Sasa ssh web1 inachukua nafasi ya ssh -p 22 matt@10.0.0.10, na jina hilo fupi linafanya kazi ndani ya scp, rsync, na git, kwa sababu zote husoma faili hili. HostName ndilo anwani halisi, User hukuokoa kuandika jina la akaunti, na IdentityFile hufunga ufunguo (key) maalum wa kutumia.

IdentitiesOnly yes inastahili sentensi, kwa sababu inarekebisha hitilafu inayochanganya. Wakati wakala wako anashikilia funguo kadhaa, mteja (client) huwatoa mmoja baada ya mwingine, na seva huhesabu kila jaribio kama lililoshindwa. Ukiwa na funguo nyingi zilizopakiwa utapata Received disconnect: Too many authentication failures kabla ya ufunguo sahihi kujaribiwa. IdentitiesOnly yes humfanya mteja atoe tu ufunguo uliotajwa katika IdentityFile, hivyo hitilafu hiyo haiwezi kutokea.

Passphrases na ssh-agent

Passphrase husimba faili ya private key iliyopo kwenye diski. Bila passphrase, mtu yeyote anayenakili faili hiyo anaweza kuitumia mara moja; ukiwa nayo, faili iliyoibwa haina matumizi hadi passphrase ikisiwe. Kwa ufunguo uliopo kwenye laptop, hii ndiyo ulinzi unaohitaji, kwa sababu laptop huibwa na backups za laptop huvuja.

Sababu inayofanya passphrase isiwe na gharama yoyote katika utendaji ni ssh-agent. Wakala (agent) huhifadhi ufunguo wako ulioshushwa usimbaji (decrypted) kwenye kumbukumbu, kwa hivyo unaingiza passphrase mara moja kwa kila kikao cha kuingia (login session) na kila muunganisho unaofuata huwa wa papo hapo. Usambazaji mwingi wa desktop Linux na macOS tayari huendesha wakala kwa ajili yako. Pakia ufunguo wako ndani yake kwa kutumia:

ssh-add ~/.ssh/id_ed25519

ssh-add -l huorodhesha funguo ambazo wakala anazo kwa sasa. Tahadhari moja: agent forwarding (ssh -A) huruhusu seva ya mbali kutumia wakala wako ili kujitambulisha (authenticate) mbele zaidi wakati umeunganishwa, kwa hivyo iwezeshe tu kuelekea seva unazoziamini kikamilifu, na uiache ikiwa imezimwa kwa chaguo-msingi.

Kuzungusha na kubatilisha: utaratibu wa kompyuta ndogo iliyopotea

Kubatilisha ufunguo wa SSH wa kawaida si kitu kingine zaidi ya kuondoa mstari wake kutoka kwenye authorized_keys katika kila seva iliyo nao. Hakuna mamlaka ya utoaji vyeti ya kutaarifiwa na hakuna tarehe ya mwisho ya kusubiri. Mara tu mstari huo unapoondolewa, kuingia kwa kutumia ufunguo huo kunashindwa.

Fanya zoezi hili sasa, wakati si dharura. Chagua seva, fungua ~/.ssh/authorized_keys, na utafute ufunguo kwa kutumia maoni yake. Futa mstari huo kwa kutumia kihariri, au uchuuje kwa kutumia maoni:

grep -v ' laptop$' ~/.ssh/authorized_keys > ~/.ssh/authorized_keys.tmp
mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys

Kisha thibitisha kutoka kwenye kifaa ulichokibatilisha kuwa kuingia sasa kunashindwa, na kutoka kwenye kifaa kingine kuwa kuingia bado kunafanya kazi. Zingatia jambo moja: kuondoa ufunguo hakufungi vipindi (sessions) ambavyo tayari vimefunguliwa, kwa sababu ufunguo hukaguliwa wakati wa kuingia pekee. Ikiwa unabatilisha kifaa kilichoibwa, kagua pia who kwenye seva na ufunge kipindi chochote usichokitambua.

Kuzungusha (rotation) ni operesheni ileile katika mpangilio tofauti: tengeneza ufunguo mpya kwenye kifaa, uweke kwa kutumia ssh-copy-id, thibitisha kuwa ufunguo mpya unaingia, kisha ufute mstari wa zamani. Fanya hivi wakati kifaa kinabadilisha mtumiaji, wakati ufunguo unaweza kuwa umefichuliwa, au wakati mtu anapoondoka kwenye timu. Kufanya hivi kwa mikono kwenye seva mbili ni sawa; kwenye seva ishirini ni kazi ya otomatiki, na kusimamia seva nyingi za Linux inaonyesha jinsi ya kusukuma hali ileile ya authorized_keys kwenye kundi zima la seva.

Mambo ya kuepuka

  • Usitumie private key moja kwenye vifaa vyako vyote. Hii inafanya kuwa vigumu kufuta uwezo wa kifaa kimoja kilichoibiwa bila kubadilisha key hiyo kila mahali.
  • Usiweke private key kwenye git repository, hata kama ni ya siri. Programu za kuchanganua (scanners) hufuatilia repositories za umma na kujaribu kutumia key zilizovuja ndani ya dakika chache baada ya push, na repository inayofanywa kuwa ya umma baadaye itavujisha historia yake yote.
  • Usipakie private key ya kompyuta yako kwenye seva ili seva hiyo iweze kufikia seva nyingine. Tengeneza key tofauti kwenye seva yenyewe, na uipe idhini key hiyo mahali inapohitajika pekee.
  • Usibandike private key kwenye chat, barua pepe, au tiketi ya msaada. Public key, faili la .pub, ndilo nusu pekee inayopaswa kushirikiwa.

Mara tu key yako inapokuwezesha kuingia kwenye mfumo kwa uhakika, chukua hatua inayofuata na uzime uthibitishaji wa nenosiri (password authentication), ili majaribio ya mara kwa mara ya kukisia nenosiri dhidi ya seva yako yasifanikiwe kabisa. Usanidi wa moja kwa moja wa kufanya hivyo unapatikana katika SSH hardening on a VPS.

FAQ

Funguo za SSH hufanyaje kazi bila kutuma nenosiri?

Seva huhifadhi ufunguo wako wa umma (public key) katika ~/.ssh/authorized_keys. Wakati wa kuingia, seva hutuma changamoto (challenge), mteja wako husaini changamoto hiyo kwa kutumia ufunguo wa siri (private key), na seva huthibitisha sahihi hiyo kwa kutumia ufunguo wa umma. Ufunguo wa siri hauwahi kuondoka kwenye kifaa chako, kwa hivyo hakuna kinachoweza kunaswa wakati wa usafirishaji na hakuna kitu kinachoweza kutumika tena ili kuibiwa kutoka kwa seva. Seva iliyovamiwa huvujisha funguo za umma pekee, ambazo haziwezi kutumika kuingia popote.

Je, nitumie ufunguo mmoja wa SSH kwa seva zangu zote?

Kutumia ufunguo mmoja katika seva nyingi ni sahihi, mradi ufunguo huo ukae kwenye kifaa kimoja tu. Kanuni ni ufunguo mmoja kwa kila kifaa, si mmoja kwa kila seva: ufunguo wa umma wa laptop yako huwekwa kwenye kila seva ambayo laptop hiyo inahitaji, na desktop yako ina ufunguo wake. Hii hurahisisha ufutaji wa ufikiaji (revocation), kwa sababu kupoteza kifaa kunamaanisha kuondoa mstari mmoja unaotambulika kutoka kwa kila seva, na vifaa vingine vitaendelea kufanya kazi.

Saraka ya .ssh na authorized_keys zinapaswa kuwa na ruhusa gani?

Weka 700 kwenye ~/.ssh na 600 kwenye authorized_keys na kwenye kila ufunguo wa siri, zikiwa zinamilikiwa na akaunti inayozitumia. sshd huendeshwa kwa kutumia StrictModes yes kwa chaguo-msingi, kwa hivyo faili au saraka ya nyumbani (home directory) ambayo mtu yeyote isipokuwa wewe anaweza kuiandikia itafanya sshd ipuuze ufunguo wako kimya kimya, na alama pekee itakuwa Authentication refused: bad ownership or modes katika logi ya uthibitishaji ya seva au journal.

Ninaondoaje ufunguo wa SSH kutoka kwa seva?

Futa mstari wa ufunguo huo kutoka kwa ~/.ssh/authorized_keys katika akaunti uliyoidhinisha. Tafuta mstari sahihi kwa kutumia maoni yake (comment), lebo iliyo baada ya data ya ufunguo. Kuingia kwingine kwa kutumia ufunguo huo kutafeli mara moja, lakini vikao (sessions) ambavyo tayari vimefunguliwa vitabaki wazi, kwa hivyo maliza kikao chochote kinachoendelea kwa kifaa hicho pia ikiwa kiliibiwa. Rudia hatua hizi kwenye kila seva ambayo ufunguo huo ulinakiliwa.

Je, ninahitaji nenosiri (passphrase) kwenye ufunguo wangu wa SSH?

Kwa ufunguo uliopo kwenye laptop au desktop, ndiyo. Nenosiri husimba faili ya ufunguo, kwa hivyo nakala iliyoibiwa au kuvuja haina maana yenyewe, na ssh-agent inamaanisha unaiandika mara moja kwa kila kikao badala ya kila muunganisho. Funguo zinazotumiwa na otomatiki isiyosimamiwa (unattended automation) kwenye seva kwa kawaida huwa hazina nenosiri, kwa sababu hakuna binadamu wa kuliandika; linda funguo hizo kwa kuzuia kile ambacho akaunti lengwa inaweza kufanya.