Workshop RHEL 8 Beta: Gina aikace-aikacen gidan yanar gizo masu aiki

RHEL 8 Beta yana ba wa masu haɓaka sabbin fasaloli da yawa, waɗanda jerin su na iya ɗaukar shafuka, amma koyon sabbin abubuwa koyaushe yana da kyau ta hanyar aiki, don haka a ƙasa muna ba da jagora mai amfani don ƙirƙirar ainihin kayan aikin aikace-aikace bisa ga Red Hat Enterprise. Linux 8 Beta.

Workshop RHEL 8 Beta: Gina aikace-aikacen gidan yanar gizo masu aiki

Bari mu ɗauki Python, sanannen yaren shirye-shirye tsakanin masu haɓakawa, a matsayin tushe, haɗin Django da PostgreSQL, haɗaɗɗiyar gama gari don ƙirƙirar aikace-aikace, kuma saita RHEL 8 Beta don aiki tare da su. Sa'an nan kuma za mu ƙara wasu nau'o'in nau'i biyu (wanda ba a raba su ba).

Yanayin gwajin zai canza, saboda yana da ban sha'awa don bincika yiwuwar aiki da kai, aiki tare da kwantena da kuma gwada yanayin tare da sabobin masu yawa. Don farawa da sabon aikin, zaku iya farawa ta ƙirƙirar ƙaramin samfuri mai sauƙi da hannu don ku iya ganin ainihin abin da ke buƙatar faruwa da yadda yake mu'amala, sannan ku matsa don yin aiki da kai da ƙirƙirar ƙarin hadaddun jeri. A yau muna magana ne game da ƙirƙirar irin wannan samfurin.

Bari mu fara da tura hoton RHEL 8 Beta VM. Kuna iya shigar da injin kama-da-wane daga karce, ko amfani da hoton baƙo na KVM da ke tare da biyan kuɗin ku na Beta. Lokacin amfani da hoton baƙo, kuna buƙatar saita CD mai kama-da-wane wanda zai ƙunshi metadata da bayanan mai amfani don ƙaddamarwar girgije (Cloud-init). Ba kwa buƙatar yin wani abu na musamman tare da tsarin diski ko fakitin da ke akwai; kowane tsari zai yi.

Bari mu dubi tsarin duka.

Shigar Django

Tare da sabuwar sigar Django, kuna buƙatar yanayi mai kama-da-wane (virtualenv) tare da Python 3.5 ko kuma daga baya. A cikin bayanan Beta za ku iya ganin cewa Python 3.6 yana samuwa, bari mu bincika idan da gaske haka lamarin yake:

[cloud-user@8beta1 ~]$ python
-bash: python: command not found
[cloud-user@8beta1 ~]$ python3
-bash: python3: command not found

Red Hat yana amfani da Python a matsayin kayan aikin kayan aiki a cikin RHEL, don haka me yasa wannan sakamakon?

Gaskiyar ita ce, yawancin masu haɓaka Python har yanzu suna tunanin sauye-sauye daga Python 2 zuwa Python 2, yayin da Python 3 kanta ke ƙarƙashin ci gaba mai ƙarfi, kuma ƙarin sabbin nau'ikan suna fitowa koyaushe. Don haka, don saduwa da buƙatar ingantaccen kayan aikin tsarin yayin ba wa masu amfani damar zuwa sabbin nau'ikan Python daban-daban, tsarin Python ya koma cikin sabon fakiti kuma ya ba da ikon shigar da Python 2.7 da 3.6. Ana iya samun ƙarin bayani game da canje-canjen da kuma dalilin da yasa aka yi su a cikin ɗaba'ar Langdon White's blog (Langdon White).

Don haka, don samun Python aiki, kuna buƙatar shigar da fakiti biyu kawai, tare da python3-pip wanda aka haɗa azaman dogaro.

sudo yum install python36 python3-virtualenv

Me zai hana a yi amfani da kiran ƙirar kai tsaye kamar yadda Langdon ya ba da shawara kuma shigar da pip3? Yin la'akari da aiki da kai mai zuwa, an san cewa Mai yiwuwa zai buƙaci shigar da pip don gudana, tun da tsarin pip ba ya goyan bayan virtualenvs tare da al'ada pip executable.

Tare da mai fassara python3 mai aiki a hannunku, zaku iya ci gaba da tsarin shigarwa na Django kuma ku sami tsarin aiki tare da sauran abubuwan mu. Akwai zaɓuɓɓukan aiwatarwa da yawa da ake samu akan Intanet. Akwai sigar guda daya da aka gabatar anan, amma masu amfani zasu iya amfani da nasu tsarin.

Za mu shigar da nau'ikan PostgreSQL da Nginx da ke cikin RHEL 8 ta tsohuwa ta amfani da Yum.

sudo yum install nginx postgresql-server

PostgreSQL zai buƙaci psycopg2, amma yana buƙatar samuwa ne kawai a cikin yanayin virtualenv, don haka za mu shigar da shi ta amfani da pip3 tare da Django da Gunicorn. Amma da farko muna buƙatar saita virtualenv.

На тему правильного выбора места установки проектов Django всегда ведется много споров, но, когда возникают какие-то сомнения, всегда можно обратиться к стандарту Linux Filesystem Hierarchy Standard. В частности, в FHS сказано, что /srv используется для: «хранения данных, специфических для конкретного узла, – данных, которые выдает система, например, данных и скриптов веб-серверов, данных, хранящихся на FTP серверах, а также репозиториев систем контроля версий (появившихся в FHS-2.3 в 2004 году)».

Wannan shine ainihin lamarinmu, don haka mun sanya duk abin da muke buƙata a cikin /srv, wanda mai amfani da aikace-aikacen mu ne (mai amfani da Cloud).

sudo mkdir /srv/djangoapp
sudo chown cloud-user:cloud-user /srv/djangoapp
cd /srv/djangoapp
virtualenv django
source django/bin/activate
pip3 install django gunicorn psycopg2
./django-admin startproject djangoapp /srv/djangoapp

Saita PostgreSQL da Django abu ne mai sauƙi: ƙirƙirar bayanai, ƙirƙirar mai amfani, saita izini. Abu daya da ya kamata a tuna lokacin da aka fara shigar da PostgreSQL shine rubutun saitin postgresql wanda aka shigar tare da kunshin sabar postgresql. Wannan rubutun yana taimaka muku aiwatar da ayyuka na asali masu alaƙa da sarrafa tarin bayanai, kamar ƙaddamar da gungu ko tsarin haɓakawa. Don saita sabon misalin PostgreSQL akan tsarin RHEL, muna buƙatar gudanar da umarni:

sudo /usr/bin/postgresql-setup -initdb

Kuna iya fara PostgreSQL ta amfani da systemd, ƙirƙirar bayanai, kuma saita aiki a Django. Tuna don sake kunna PostgreSQL bayan yin canje-canje ga fayil ɗin daidaitawar abokin ciniki (yawanci pg_hba.conf) don saita ma'ajin kalmar sirri don mai amfani da aikace-aikacen. Idan kun ci karo da wasu matsaloli, tabbatar da canza saitunan IPv4 da IPv6 a cikin fayil pg_hba.conf.

systemctl enable -now postgresql

sudo -u postgres psql
postgres=# create database djangoapp;
postgres=# create user djangouser with password 'qwer4321';
postgres=# alter role djangouser set client_encoding to 'utf8';
postgres=# alter role djangouser set default_transaction_isolation to 'read committed';
postgres=# alter role djangouser set timezone to 'utc';
postgres=# grant all on DATABASE djangoapp to djangouser;
postgres=# q

A cikin fayil /var/lib/pgsql/data/pg_hba.conf:

# IPv4 local connections:
host    all        all 0.0.0.0/0                md5
# IPv6 local connections:
host    all        all ::1/128                 md5

A cikin fayil /srv/djangoapp/settings.py:

# Database
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': '{{ db_name }}',
       'USER': '{{ db_user }}',
       'PASSWORD': '{{ db_password }}',
       'HOST': '{{ db_host }}',
   }
}

Bayan daidaita fayil ɗin settings.py a cikin aikin da kuma saita saitunan bayanai, zaku iya fara uwar garken ci gaba don tabbatar da cewa komai yana aiki. Bayan fara uwar garken ci gaba, yana da kyau a ƙirƙiri mai amfani da admin don gwada haɗin yanar gizon.

./manage.py runserver 0.0.0.0:8000
./manage.py createsuperuser

WSGI? Wai?

Sabar ci gaba tana da amfani don gwaji, amma don gudanar da aikace-aikacen dole ne ka saita uwar garken da ta dace da kuma wakili don Interface Ƙofar Gidan Yanar Gizo (WSGI). Akwai haɗuwa gama gari da yawa, misali, Apache HTTPD tare da uWSGI ko Nginx tare da Gunicorn.

Manufar hanyar sadarwa ta hanyar uwar garken yanar gizo (Web Server Gateway Interface) ita ce a tura buƙatun daga uwar garken yanar gizo Ga tsarin yanar gizo na Python. WSGI wani abu ne da ya faru a baya, lokacin da ake amfani da hanyoyin CGI, kuma a yau WSGI misali ne na gaskiya, ba tare da la'akari da sabar yanar gizo ko tsarin Python da aka yi amfani da shi ba. Duk da yawan karɓuwarsa, har yanzu akwai wasu bambance-bambance da yawa yayin aiki tare da waɗannan tsarin, da kuma zaɓuɓɓuka iri-iri. A wannan yanayin, za mu yi ƙoƙarin kafa sadarwa tsakanin Gunicorn da Nginx ta hanyar soket.

Tunda ana shigar da waɗannan abubuwan biyu akan sabar guda ɗaya, bari mu gwada amfani da soket na UNIX maimakon soket na cibiyar sadarwa. Tunda sadarwa tana buƙatar soket a kowane hali, bari mu yi ƙoƙarin ɗaukar ƙarin mataki kuma saita kunna soket don Gunicorn ta hanyar tsarin.

Tsarin ƙirƙirar ayyukan kunna soket abu ne mai sauƙi. Da farko, an ƙirƙiri fayil ɗin raka'a wanda ya ƙunshi umarnin ListenStream yana nuni zuwa wurin da za a ƙirƙiri soket ɗin UNIX, sannan fayil ɗin naúrar sabis ɗin wanda umarnin da ake buƙata zai nuna fayil ɗin naúrar soket. Sannan, a cikin fayil ɗin sashin sabis, abin da ya rage shine a kira Gunicorn daga mahallin kama-da-wane kuma ƙirƙirar ɗaurin WSGI don soket na UNIX da aikace-aikacen Django.

Anan akwai wasu misalan fayilolin naúrar waɗanda zaku iya amfani da su azaman tushe. Da farko mun kafa soket.

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Yanzu kuna buƙatar saita Gunicorn daemon.

[Unit]
Description=Gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=cloud-user
Group=cloud-user
WorkingDirectory=/srv/djangoapp

ExecStart=/srv/djangoapp/django/bin/gunicorn 
         —access-logfile - 
         —workers 3 
         —bind unix:gunicorn.sock djangoapp.wsgi

[Install]
WantedBy=multi-user.target

Don Nginx, al'amari ne mai sauƙi na ƙirƙirar fayilolin sanyi na wakili da kuma kafa kundin adireshi don adana abun ciki na tsaye idan kuna amfani da ɗaya. A cikin RHEL, fayilolin sanyi na Nginx suna cikin /etc/nginx/conf.d. Kuna iya kwafin misalin mai zuwa cikin fayil /etc/nginx/conf.d/default.conf kuma fara sabis ɗin. Tabbatar da saita sunan uwar garke don dacewa da sunan mai masaukin ku.

server {
   listen 80;
   server_name 8beta1.example.com;

   location = /favicon.ico { access_log off; log_not_found off; }
   location /static/ {
       root /srv/djangoapp;
   }

   location / {
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_pass http://unix:/run/gunicorn.sock;
   }
}

Fara Socket Gunicorn da Nginx ta amfani da systemd kuma kuna shirye don fara gwaji.

Kuskuren Ƙofar Mara kyau?

Если вы введете адрес в браузер, то, вероятнее всего, получите ошибку 502 Bad Gateway. Она может быть вызвана некорректно настроенными разрешениями для сокета UNIX, или обусловлена более сложными проблемами, связанными с управлением доступом в SELinux.

A cikin kuskuren nginx zaku iya ganin layi kamar haka:

2018/12/18 15:38:03 [crit] 12734#0: *3 connect() to unix:/run/gunicorn.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.122.1, server: 8beta1.example.com, request: "GET / HTTP/1.1", upstream: "http://unix:/run/gunicorn.sock:/", host: "8beta1.example.com"

Idan muka gwada Gunicorn kai tsaye, za mu sami amsar fanko.

curl —unix-socket /run/gunicorn.sock 8beta1.example.com

Давайте разберемся, почему это происходит. Если открыть журнал, то вероятнее всего, увидим, что проблема связана с SELinux. Поскольку у нас запущен демон, для которого не было создано своей политики, он помечается как init_t. Проверим эту теорию на практике.

sudo setenforce 0

Duk wannan yana iya haifar da zargi da hawaye na jini, amma wannan shine kawai lalata samfurin. Mu kashe cak din kawai don tabbatar da cewa matsalar ita ce, bayan haka za mu mayar da komai zuwa wurinsa.

Ta hanyar sabunta shafin a cikin burauzar yanar gizo ko sake aiwatar da umarnin curl ɗin mu, zaku iya ganin shafin gwajin Django.

Итак, убедившись, что все работает, и больше никаких проблем с разрешениями нет, мы вновь включаем SELinux.

sudo setenforce 1

Здесь не будет рассказа об audit2allow и о создании политик на основе оповещений с помощью sepolgen, поскольку на данный момент нет реального приложения Django, то нет и полной карты того, к чему Gunicorn может захотеть получить доступ, и к чему этот доступ следует запретить. Поэтому необходимо сохранить работу SELinux для защиты системы, и в то же время разрешить приложению запускаться и оставлять сообщения в журнале аудита, чтобы можно было затем на их основе создать реальную политику.

Ƙayyadaddun yankuna masu izini

О разрешенных доменах в SELinux не все слышали, но в них нет ничего нового. Многие даже работали с ними, сами об этом не догадываясь. Когда создается политика на основе сообщений аудита, созданная политика представляет собой разрешенный домен. Попробуем создать простейшую разрешительную политику.

Don ƙirƙirar takamaiman yanki da aka yarda don Gunicorn, kuna buƙatar wasu nau'ikan manufofi, kuma kuna buƙatar yiwa fayilolin da suka dace alama. Bugu da ƙari, ana buƙatar kayan aiki don haɗa sabbin manufofi.

sudo yum install selinux-policy-devel

Ƙimar yankunan da aka ba da izini babban kayan aiki ne don gano matsaloli, musamman ma idan yazo da aikace-aikacen al'ada ko aikace-aikacen da ke jigilar kaya ba tare da manufofin da aka riga aka ƙirƙira ba. A wannan yanayin, manufofin yankin da aka yarda don Gunicorn zai zama mai sauƙi kamar yadda zai yiwu - ayyana babban nau'in (gunicorn_t), ayyana nau'in da za mu yi amfani da shi don yiwa masu aiwatarwa da yawa alama (gunicorn_exec_t), sannan saita canji don tsarin don yin alama daidai. tafiyar matakai . Layin ƙarshe yana saita manufofin kamar yadda aka kunna ta tsohuwa a lokacin da aka loda shi.

gunicorn.te:

policy_module(gunicorn, 1.0)

type gunicorn_t;
type gunicorn_exec_t;
init_daemon_domain(gunicorn_t, gunicorn_exec_t)
permissive gunicorn_t;

Kuna iya haɗa wannan fayil ɗin manufofin kuma ƙara shi zuwa tsarin ku.

make -f /usr/share/selinux/devel/Makefile
sudo semodule -i gunicorn.pp

sudo semanage permissive -a gunicorn_t
sudo semodule -l | grep permissive

Давайте проверим, не блокирует ли SELinux что-то еще, помимо того, к чему обращается наш неизвестный демон.

sudo ausearch -m AVC

type=AVC msg=audit(1545315977.237:1273): avc:  denied { write } for pid=19400 comm="nginx" name="gunicorn.sock" dev="tmpfs" ino=52977 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:var_run_t:s0 tclass=sock_file permissive=0

SELinux не дает Nginx записывать данные в сокет UNIX, используемый Gunicorn. Обычно в таких случаях начинают менять политики, но впереди предстоит решить и другие задачи. Можно также изменить настройки домена, превратив его из домена ограничений в домен разрешений. Теперь перенесем httpd_t в домен разрешений. Это обеспечит Nginx необходимый доступ, и мы сможем продолжить дальнейшую работу по отладке.

sudo semanage permissive -a httpd_t

Итак, когда удалось сохранить защиту SELinux (на самом деле не следует оставлять проект с SELinux в режиме ограничений) и домены разрешений загружаются, необходимо выяснить, что именно нужно пометить как gunicorn_exec_t, чтобы все вновь заработало как положено. Попробуем обратиться к веб-сайту, чтобы увидеть новые сообщения об ограничениях в доступе.

sudo ausearch -m AVC -c gunicorn

Za ku ga saƙonni da yawa da ke ɗauke da 'comm="gunicorn"' waɗanda ke yin abubuwa daban-daban akan fayiloli a /srv/djangoapp, don haka a fili wannan yana ɗaya daga cikin umarni masu daraja.

Amma ban da haka, sako kamar haka yana bayyana:

type=AVC msg=audit(1545320700.070:1542): avc:  denied { execute } for pid=20704 comm="(gunicorn)" name="python3.6" dev="vda3" ino=8515706 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file permissive=0

Idan kun kalli matsayin sabis na gunicorn ko gudanar da umarnin ps, ba za ku ga kowane matakai masu gudana ba. Yana kama da gunicorn yana ƙoƙarin samun dama ga mai fassarar Python a cikin mahallin mu na virtualenv, mai yiwuwa don gudanar da rubutun ma'aikata. Don haka yanzu bari mu yi alama waɗannan fayilolin guda biyu masu aiwatarwa kuma mu bincika ko za mu iya buɗe shafin gwajin Django ɗin mu.

chcon -t gunicorn_exec_t /srv/djangoapp/django/bin/gunicorn /srv/djangoapp/django/bin/python3.6

Ana buƙatar sake kunna sabis na gunicorn kafin a iya zaɓar sabon tag. Kuna iya sake kunna shi nan da nan ko dakatar da sabis ɗin kuma bari soket ta fara shi lokacin da kuka buɗe rukunin yanar gizon a cikin mai lilo. Tabbatar da cewa matakai sun karɓi madaidaicin takalmi ta amfani da ps.

ps -efZ | grep gunicorn

Не забудьте потом создать нормальную политику SELinux!

Idan ka kalli saƙonnin AVC yanzu, saƙon ƙarshe ya ƙunshi izini = 1 ga duk abin da ke da alaƙa da aikace-aikacen, da izini = 0 ga sauran tsarin. Idan kun fahimci irin damar da ainihin aikace-aikacen ke buƙata, zaku iya samun sauri mafi kyawun hanyar magance irin waɗannan matsalolin. Amma har sai lokacin, yana da kyau a kiyaye tsarin kuma a sami cikakkiyar tantancewar aikin Django mai amfani.

sudo ausearch -m AVC

Ya faru!

Aikin Django mai aiki ya bayyana tare da gaban gaba bisa Nginx da Gunicorn WSGI. Mun saita Python 3 da PostgreSQL 10 daga wuraren ajiyar beta na RHEL 8. Yanzu za ku iya ci gaba da ƙirƙira (ko kawai tura) aikace-aikacen Django ko bincika wasu kayan aikin da ake da su a cikin RHEL 8 Beta don sarrafa tsarin daidaitawa, haɓaka aiki, ko ma ɗaukar wannan sanyi.

source: www.habr.com

Sayi amintaccen masauki don shafuka tare da kariyar DDoS, sabar VPS VDS 🔥 Sayi ingantaccen masaukin yanar gizo tare da kariyar DDoS, sabar VPS VDS | ProHoster