Mwongozo

Ruhusa za faili za Linux: chmod, chown na sudo kwa mifano

Imesasishwa: · Skillaria.Top

Ruhusa za faili za Linux zimewekwa na seti tatu za rwx — kwa mmiliki, kundi na wengine; hubadilishwa kwa chmod kwa umbo la alama (chmod u+x) au namba (chmod 755, ambapo r=4, w=2, x=1). Umiliki hubadilishwa na chown, na vitendo vya msimamizi hufanywa kwa sudo; hitilafu ya Permission denied karibu kila mara maana yake ni kwamba mtumiaji wako hana ruhusa inayohitajika kwenye faili au kwenye mojawapo ya saraka za njia.

Ruhusa za Linux hujibu swali "nani anaweza kufanya nini na faili". Kila faili lina mmiliki, kundi, na seti tatu za ruhusa: kwa mmiliki, kwa kundi, na kwa wengine wote. Ruhusa hubadilishwa kwa amri chmod, umiliki kwa chown, na vitendo vya msimamizi hufanywa kwa sudo. Hebu tuone jinsi ya kusoma ruhusa, kuzibadilisha, na kurekebisha hitilafu Permission denied.

Jinsi ya kuona ruhusa za faili

Ruhusa zinaonekana kwenye matokeo ya ls -l:

$ ls -l
-rw-r--r-- 1 alice developers  1204 Oct 10 14:02 notes.txt
-rwxr-xr-x 1 alice developers   356 Oct 10 14:05 deploy.sh
drwxr-x--- 2 alice developers  4096 Oct 10 13:50 secrets

Herufi kumi za kwanza zinasomwa hivi:

  • Herufi ya kwanza — aina: - faili la kawaida, d saraka, l kiungo cha ishara.
  • Herufi 2–4 — ruhusa za mmiliki (user).
  • Herufi 5–7 — ruhusa za kundi (group).
  • Herufi 8–10 — ruhusa za wengine (others).

Baada ya hapo kuna idadi ya viungo vigumu, mmiliki (alice), kundi (developers), ukubwa, tarehe, na jina. Kwa faili moja, amri stat ni muhimu:

$ stat -c '%A %a %U:%G %n' deploy.sh
-rwxr-xr-x 755 alice:developers deploy.sh

Maana ya r, w na x

Maana ya ruhusa hutofautiana kati ya faili na saraka — hapa ndipo watu wengi huchanganyikiwa.

RuhusaKwa failiKwa saraka
r (read)kusoma yaliyomokuona orodha ya majina ya faili (ls)
w (write)kubadilisha yaliyomokuunda, kufuta na kubadilisha majina ya faili ndani yake
x (execute)kuendesha kama programukuingia kwenye saraka (cd) na kufikia faili kwa njia

Zingatia: mtu anaweza kufuta faili ikiwa ana ruhusa w na x kwenye saraka, hata kama hawezi kuandika kwenye faili lenyewe. Na bila x kwenye saraka, faili lililomo haliwezi kufunguliwa, hata ruhusa ya faili ikiruhusu kusoma.

Mfumo unakagua ruhusa kwa mpangilio: ukiwa mmiliki, ruhusa za mmiliki zinatumika; kama si hivyo, na uko kwenye kundi la faili, ruhusa za kundi zinatumika; kama si hivyo pia, ruhusa za wengine. Mtumiaji root hapitii ukaguzi wa kusoma na kuandika.

Umbo la namba: 755, 644, 600

Kila ruhusa ina uzito: r = 4, w = 2, x = 1. Jumla ya uzito huzaa tarakimu kutoka 0 hadi 7 kwa kila seti kati ya tatu.

TarakimuRuhusaHesabu
7rwx4+2+1
6rw-4+2
5r-x4+1
4r--4
0---0

Michanganyiko ya kawaida ambayo inafaa kuikariri:

HaliUmboInatumika wapi
644rw-r--r--faili za kawaida, usanidi, HTML
755rwxr-xr-xsaraka, skripti na programu
600rw-------funguo binafsi za SSH, faili zenye nywila
700rwx------saraka ~/.ssh, saraka binafsi
640rw-r-----usanidi unaosomwa na kundi la huduma
777rwxrwxrwxkila mtu kila kitu — karibu haitumiki kamwe

Amri ya chmod: kubadilisha ruhusa

Hali ya namba

Umbo la namba huweka ruhusa zote kwa pamoja:

chmod 644 index.html
chmod 755 deploy.sh
chmod 600 ~/.ssh/id_ed25519

Hali ya alama

Umbo la alama hubadilisha ruhusa kwa usahihi bila kugusa zingine. Kwa nani: u mmiliki, g kundi, o wengine, a wote. Kitendo: + kuongeza, - kuondoa, = kuweka kamili.

chmod +x deploy.sh        # ruhusu kuendesha
chmod u+x,g-w file        # mmiliki aweze kuendesha, kundi lisiandike
chmod o-rwx secrets/      # wengine wasipate chochote
chmod g=rx app/           # kundi kusoma na kuingia tu

Kwa kurudia: faili na saraka zinashughulikiwa tofauti

Chaguo -R hutumia ruhusa kwenye mti mzima. Lakini chmod -R 755 hufanya faili zote ziweze kutekelezwa, jambo ambalo kwa kawaida halitakiwi. Ni bora kutenganisha faili na saraka kwa find:

find /srv/site -type d -exec chmod 755 {} +
find /srv/site -type f -exec chmod 644 {} +

Pia kuna njia fupi: herufi kubwa X huongeza ruhusa ya kutekeleza kwa saraka na faili ambazo tayari zinayo.

chmod -R u=rwX,go=rX /srv/site

Amri ya chown: kubadilisha mmiliki na kundi

Ni root pekee anayeweza kubadilisha mmiliki wa faili, kwa hiyo chown karibu kila mara huendeshwa kwa sudo.

sudo chown alice report.txt               # mmiliki
sudo chown alice:developers report.txt    # mmiliki na kundi
sudo chown :www-data index.html           # kundi tu
sudo chown -R www-data:www-data /var/www/site

Kubadilisha kundi pekee kuna amri yake: sudo chgrp developers report.txt. Makundi yako mwenyewe yanaonekana kwa id au groups.

$ id
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers)

Kumwongeza mtumiaji kwenye kundi tumia sudo usermod -aG developers bob. Bendera -a ni ya lazima: bila hiyo, mtumiaji ataondolewa kwenye makundi yake mengine yote ya ziada. Kundi jipya huanza kutumika baada ya kuingia tena kwenye mfumo.

sudo: vitendo kama msimamizi

sudo huendesha amri moja kwa haki za root (au mtumiaji mwingine) na inakuomba nywila yako mwenyewe, si ya root. Kila mwito unaandikwa kwenye kumbukumbu, kwa hiyo inaonekana nani alifanya nini.

sudo apt update
sudo systemctl restart nginx
sudo -u postgres psql       # kama mtumiaji postgres
sudo -i                     # shell shirikishi ya root
sudo -l                     # ninachoruhusiwa kufanya

Nani anaruhusiwa kufanya nini imeelezwa katika /etc/sudoers na faili zilizo kwenye saraka /etc/sudoers.d/. Hariri faili hizi kwa sudo visudo pekee: hukagua sintaksia, na kosa kwenye faili halitakufungia nje ya sudo. Kwenye Ubuntu, haki za sudo hutolewa kwa kuwa mwanachama wa kundi sudo; kwenye mifumo ya familia ya RHEL, kwa kundi wheel.

# /etc/sudoers.d/deploy — mtumiaji deploy anaruhusiwa kuanzisha upya nginx tu
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx

Kwa nini sudo echo > file haifanyi kazi

Mtego unaotokea mara nyingi:

$ sudo echo "127.0.0.1 test.local" >> /etc/hosts
bash: /etc/hosts: Permission denied

Uelekezaji >> unafanywa na shell yako, si na sudo, kwa hiyo faili linafunguliwa bila haki za root. Njia sahihi ni kupitia tee:

echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts

Permission denied: sababu na jinsi ya kurekebisha

Hitilafu Permission denied ina maana kwamba kernel imekataa operesheni ya mchakato wako. Hatua za uchunguzi ni zile zile kila mara: mimi ni nani (id), mmiliki ni nani na ruhusa zake ni zipi (ls -l), na ruhusa ya kila saraka katika njia ni ipi (namei -l).

$ namei -l /srv/app/config/app.env
f: /srv/app/config/app.env
drwxr-xr-x root  root  /
drwxr-xr-x root  root  srv
drwxr-x--- deploy deploy app
drwxr-xr-x deploy deploy config
-rw-r----- deploy deploy app.env

Hapa inaonekana kwamba saraka app imefungwa kwa wengine — mtumiaji asiye kwenye kundi deploy hatapita zaidi, bila kujali ruhusa za faili lenyewe.

Skripti haiendeshi

$ ./deploy.sh
bash: ./deploy.sh: Permission denied

Faili halina ruhusa ya kutekeleza. Suluhisho ni chmod +x deploy.sh, au kuiendesha kupitia interpreter: bash deploy.sh. Ikiwa sehemu ya diski imeunganishwa na chaguo noexec (hii hutokea mara nyingi kwenye /tmp), faili haliwezi kuendeshwa moja kwa moja, na ni njia ya pili pekee inayofanya kazi.

Haiwezi kuandika kwenye saraka ya mfumo

Faili zilizo kwenye /etc, /usr na /var/www zinamilikiwa na root au watumiaji wa huduma. Tumia sudo kwa mabadiliko ya mara moja, na kwa kazi ya kudumu mpe kundi ruhusa, si kila mtu.

Web server inarudisha 403

Nginx au Apache zinaendeshwa na mtumiaji www-data (kwenye Debian na Ubuntu). Inahitaji ruhusa ya kusoma faili na x kwenye saraka zote za njia. Marekebisho: sudo chown -R www-data:www-data /var/www/site, au ruhusa 755 kwa saraka na 644 kwa faili.

SSH haikubali funguo

SSH inakataa kutumia funguo ambazo ruhusa zake ni wazi sana. Ufunguo binafsi lazima uwe na ruhusa 600, saraka ~/.ssh iwe 700, na faili authorized_keys kwenye seva liwe 600.

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys

Hakuna ufikiaji wa Docker

Ujumbe permission denied while trying to connect to the Docker daemon socket unamaanisha kwamba hauko kwenye kundi docker. Endesha sudo usermod -aG docker $USER kisha uingie tena kwenye mfumo. Kumbuka, uanachama wa kundi hili kiutendaji ni sawa na haki za root.

Kwa nini chmod 777 ni wazo baya

Ushauri wa "endesha tu chmod 777" huondoa hitilafu, lakini unafungua faili kwa kuandikwa na kila mtumiaji na kila mchakato kwenye mfumo. Ikiwa programu ya wavuti itadukuliwa, mshambuliaji anaweza kubadilisha faili hizo. Njia sahihi ni kujua ni mtumiaji gani anahitaji ufikiaji, kisha kumpa ruhusa hiyo moja kwa moja — kupitia mmiliki au kundi.

umask: ruhusa za msingi

Faili jipya hupata ruhusa zilizopunguzwa na umask. Kwa thamani ya kawaida 022, faili huundwa na ruhusa 644 na saraka na 755.

$ umask
0022

Muhtasari

Ruhusa za Linux ni seti tatu za rwx kwa mmiliki, kundi na wengine. chmod hubadilisha ruhusa kwa namba (755, 644, 600) au kwa alama, chown hubadilisha mmiliki, na sudo huruhusu amri moja kuendeshwa kama root. Hitilafu ya Permission denied inapotokea, angalia mtumiaji wako, ruhusa za faili, na ruhusa za kila saraka kwenye njia, na usiitatue kwa 777. Watumiaji, makundi, ruhusa na sudo vinafundishwa kwa kina kwa vitendo katika kozi ya Linux.

Maswali ya mara kwa mara

chmod 755 inamaanisha nini?

Mmiliki anaweza kusoma, kuandika na kutekeleza (7); kundi na wengine wanaweza kusoma na kutekeleza (5). Ni mchanganyiko wa kawaida wa saraka na skripti.

chmod inatofautianaje na chown?

chmod hubadilisha ruhusa (nini kinaweza kufanywa kwa faili), wakati chown hubadilisha mmiliki na kundi (ruhusa hizo ni za nani).

Nitampaje mtumiaji haki za sudo?

Kwenye Ubuntu na Debian, mwongeze kwenye kundi sudo kwa sudo usermod -aG sudo jina; kwenye mifumo ya RHEL, kwenye kundi wheel. Mabadiliko yanaanza baada ya kuingia tena.

Ruhusa 4755 na biti ya SUID ni nini?

Tarakimu 4 mbele huwasha SUID: programu inaendeshwa kwa haki za mmiliki wa faili, si za aliyeiendesha. Mfano ni passwd; kwenye matokeo ya ls, herufi x ya mmiliki inageuka kuwa s.

Kwa nini root anaweza kusoma faili lenye ruhusa 000?

Kernel haikagui ruhusa za kawaida za kusoma na kuandika kwa root. Kumzuia root kunawezekana tu kwa njia nyingine, kwa mfano SELinux, AppArmor, au sifa ya chattr +i.

Jifunze mada hii kwa video

Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Linux: с нуля до уверенного администрирования”.

Nenda kwenye kozi