Ụlọ ọrụ RHEL 8 Beta: Iwuli ngwa weebụ na-arụ ọrụ

RHEL 8 Beta na-enye ndị mmepe ọtụtụ atụmatụ ọhụrụ, ndepụta nke nwere ike iwepụta ibe, Otú ọ dị, ịmụta ihe ọhụrụ na-adị mma mgbe niile na omume, yabụ n'okpuru ebe a anyị na-enye ogbako na ịmepụta ngwa ngwa dabere na Red Hat Enterprise Linux 8 Beta.

Ụlọ ọrụ RHEL 8 Beta: Iwuli ngwa weebụ na-arụ ọrụ

Ka anyị were Python, asụsụ mmemme na-ewu ewu n'etiti ndị mmepe, dịka ndabere, ngwakọta nke Django na PostgreSQL, ngwakọta a na-ahụkarị maka imepụta ngwa, wee hazie RHEL 8 Beta ka ya na ha rụọ ọrụ. Mgbe ahụ, anyị ga-agbakwunye ihe abụọ (anaghị akọwapụta).

Gburugburu ule ga-agbanwe, n'ihi na ọ na-adọrọ mmasị ịchọpụta ohere nke akpaaka, na-arụ ọrụ na arịa na gburugburu ebe obibi na ọtụtụ sava. Iji malite ọrụ ọhụrụ, ị nwere ike ịmalite site na ịmepụta obere ihe nrịbama dị mfe site n'aka ka ị wee hụ kpọmkwem ihe kwesịrị ime na otu o si emekọrịta, wee gaa n'ihu na-akpaghị aka na ịmepụta nhazi mgbagwoju anya. Taa, anyị na-ekwu maka ịmepụta ụdị prototype.

Ka anyị bido site na ibugharị onyonyo beta VM RHEL 8. Ị nwere ike ịwụnye igwe mebere site na ọkọ, ma ọ bụ jiri onyonyo ọbịa KVM dị na ndenye aha Beta gị. Mgbe ị na-eji onyonyo ọbịa, ị ga-achọ ịhazi CD mebere nke ga-enwe metadata na data njirimara maka mmalite igwe ojii (cloud-init). Ịkwesighi ime ihe ọ bụla pụrụ iche na nhazi diski ma ọ bụ nchịkọta dịnụ;

Ka anyị lebakwuo anya na usoro a dum.

Ịwụnye Django

Site na ụdị Django kachasị ọhụrụ, ị ga-achọ ebe mebere (virtualenv) nwere Python 3.5 ma ọ bụ karịa. Na ndetu Beta ị nwere ike ịhụ na Python 3.6 dị, ka anyị lelee ma nke a bụ eziokwu:

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

Uhie okpu na-arụsi ọrụ ike na Python dị ka ngwa ngwa ngwa na RHEL, yabụ kedu ihe kpatara nke a?

Nke bụ eziokwu bụ na ọtụtụ ndị na-emepụta Python ka na-atụgharị uche na mgbanwe site na Python 2 gaa Python 2, ebe Python 3 n'onwe ya nọ n'okpuru mmepe na-arụ ọrụ, na ọtụtụ nsụgharị ọhụrụ na-apụta mgbe niile. Ya mere, iji gboo mkpa maka ngwaọrụ sistemu kwụsiri ike mgbe ọ na-enye ndị ọrụ ohere ịnweta ụdị Python ọhụrụ dị iche iche, etinyere Python sistemụ n'ime ngwugwu ọhụrụ wee nye ikike ịwụnye Python 2.7 na 3.6. Enwere ike ịchọta ozi ndị ọzọ gbasara mgbanwe ndị ahụ na ihe mere e ji mee ha na mbipụta na Blog Langdon White (Langdon White).

Yabụ, iji nweta Python na-arụ ọrụ, naanị ịkwesịrị ịwụnye ngwugwu abụọ, yana python3-pip gụnyere dị ka ndabere.

sudo yum install python36 python3-virtualenv

Kedu ihe kpatara na ị gaghị eji oku modul ozugbo dị ka Langdon tụrụ aro wee wụnye pip3? N'iburu n'uche akpaaka nke na-abịa, anyị maara na ike ga-achọ pip arụnyere ka ọ na-agba ọsọ, ebe ọ bụ na pip modul anaghị akwado virtualenvs na omenala pip executable.

Site na onye ntụgharị okwu python3 na-arụ ọrụ dị n'aka gị, ị nwere ike ịga n'ihu na usoro nrụnye Django ma nwee usoro ọrụ yana akụrụngwa anyị ndị ọzọ. Enwere ọtụtụ nhọrọ mmejuputa dị na ịntanetị. Enwere otu ụdị ewepụtara ebe a, mana ndị ọrụ nwere ike iji usoro nke ha.

Anyị ga-etinye ụdị PostgreSQL na Nginx dị na RHEL 8 site na ndabara site na iji Yum.

sudo yum install nginx postgresql-server

PostgreSQL ga-achọ psycopg2, mana ọ kwesịrị ịdị naanị na gburugburu virtualenv, yabụ anyị ga-etinye ya site na iji pip3 yana Django na Gunicorn. Ma mbụ anyị kwesịrị ịtọ virtualenv.

A na-enwe ọtụtụ arụmụka mgbe niile na isiokwu nke ịhọrọ ebe kwesịrị ekwesị iji wụnye ọrụ Django, ma mgbe ị nwere obi abụọ, ị nwere ike ịtụgharị na Linux Filesystem Hierarchy Standard. Kpọmkwem, FHS na-ekwu na / srv na-eji: "na-echekwa data-kpọmkwem data-data nke usoro na-emepụta, dị ka ihe nkesa weebụ data na scripts, data echekwara na FTP sava, na njikwa usoro repositories (na-apụta na FHS -2.3 na 2004).

Nke a bụ ikpe anyị, yabụ anyị na-etinye ihe niile anyị chọrọ n'ime / srv, nke onye ọrụ ngwa anyị nwere (onye ọrụ ojii).

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

Ịtọlite ​​​​PostgreSQL na Django dị mfe: mepụta nchekwa data, mepụta onye ọrụ, hazie ikike. Otu ihe ị ga-eburu n'uche mgbe ị na-etinye PostgreSQL na mbụ bụ edemede postgresql-setup nke etinyere na ngwugwu postgresql-server. Edemede a na-enyere gị aka ịrụ ọrụ ndị bụ isi metụtara nchịkwa ụyọkọ nchekwa data, dị ka mmalite ụyọkọ ma ọ bụ usoro nkwalite. Iji hazie ihe atụ PostgreSQL ọhụrụ na sistemụ RHEL, anyị kwesịrị ịgba ọsọ a:

sudo /usr/bin/postgresql-setup -initdb

Ị nwere ike ịmalite PostgreSQL site na iji systemd, mepụta nchekwa data, ma guzobe ọrụ na Django. Cheta ịmalitegharịa PostgreSQL mgbe ịmechara mgbanwe na faịlụ nhazi njirimara onye ahịa (na-emekarị pg_hba.conf) iji hazie nchekwa paswọọdụ maka onye ọrụ ngwa. Ọ bụrụ na ị zutere ihe isi ike ndị ọzọ, jide n'aka na ị gbanwee IPv4 na IPv6 ntọala na pg_hba.conf faịlụ.

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

Na faịlụ /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

Na faịlụ /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 }}',
   }
}

Mgbe ịhazi faịlụ settings.py na oru ngo ma guzobe nhazi nchekwa data, ị nwere ike ịmalite ihe nkesa mmepe iji jide n'aka na ihe niile na-arụ ọrụ. Mgbe ịmalitere ihe nkesa mmepe, ọ bụ ezi echiche ịmepụta onye ọrụ nchịkwa iji nwalee njikọ na nchekwa data.

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

WSGI? Wai?

Ihe nkesa mmepe bara uru maka nnwale, mana iji mee ngwa a, ị ga-ahazirịrị nkesa na proxy kwesịrị ekwesị maka Interface Gateway Web Server (WSGI). Enwere ọtụtụ ngwakọta a na-ahụkarị, dịka ọmụmaatụ, Apache HTTPD nwere uWSGI ma ọ bụ Nginx nwere Gunicorn.

Ọrụ nke ọnụ ụzọ ámá Web Server Interface bụ ibuga arịrịọ sitere na sava weebụ gaa na usoro weebụ Python. WSGI bụ relic nke jọgburu onwe ya n'oge gara aga mgbe CGI engines nọ, na taa WSGI bụ de facto ọkọlọtọ, n'agbanyeghị nke sava weebụ ma ọ bụ Python framework eji. Ma n'agbanyeghị ojiji ya zuru ebe niile, a ka nwere ọtụtụ nuances mgbe ị na-arụ ọrụ na ndị a frameworks, na ọtụtụ nhọrọ. N'okwu a, anyị ga-agbalị ịmepụta mmekọrịta n'etiti Gunicorn na Nginx site na oghere.

Ebe ọ bụ na etinyere akụkụ abụọ a n'otu ihe nkesa, ka anyị gbalịa iji oghere UNIX kama oghere netwọk. Ebe ọ bụ na nkwurịta okwu chọrọ oghere n'ọnọdụ ọ bụla, ka anyị gbalịa ime otu nzọụkwụ ọzọ wee hazie ntinye oghere maka Gunicorn site na systemd.

Usoro nke ịmepụta socket arụ ọrụ ọrụ dị nnọọ mfe. Nke mbụ, a na-emepụta faịlụ otu nke nwere ntụziaka ListenStream na-atụ aka na ebe a ga-emepụta oghere UNIX, mgbe ahụ, faịlụ otu maka ọrụ nke ntụziaka chọrọ ga-atụ aka na faịlụ socket unit. Mgbe ahụ, na faịlụ unit ọrụ, ihe fọdụrụ bụ ịkpọ Gunicorn site na gburugburu ebe obibi ma mepụta njikọ WSGI maka oghere UNIX na ngwa Django.

Nke a bụ ụfọdụ ọmụmaatụ faịlụ otu ị nwere ike iji dịka ntọala. Nke mbụ, anyị na-edozi oghere.

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Ugbu a ịkwesịrị ịhazi 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

Maka Nginx, ọ bụ ihe dị mfe ịmepụta faịlụ nhazi proxy yana ịtọ ndekọ iji chekwaa ọdịnaya kwụ ọtọ ma ọ bụrụ na ị na-eji otu. Na RHEL, faịlụ nhazi Nginx dị na /etc/nginx/conf.d. Ị nwere ike iṅomi ihe atụ na-esonụ n'ime faịlụ /etc/nginx/conf.d/default.conf wee malite ọrụ ahụ. Gbaa mbọ hụ na ịtọọ server_name ka ọ dabara aha onye ọbịa gị.

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;
   }
}

Bido oghere Gunicorn na Nginx site na iji systemd ma ị dịla njikere ịmalite ịnwale.

Njehie ụzọ ụzọ ọjọọ?

Ọ bụrụ na itinye adreesị ahụ n'ime ihe nchọgharị gị, ị ga-enweta njehie 502 Bad Gateway. Enwere ike bute ya site na ikikere oghere UNIX ahaziri ezighi ezi, ma ọ bụ ọ nwere ike ịbụ n'ihi okwu ndị dị mgbagwoju anya metụtara ịnweta njikwa na SELinux.

Na nginx njehie log ị nwere ike ịhụ ahịrị dị ka nke a:

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"

Ọ bụrụ na anyị nwalee Gunicorn ozugbo, anyị ga-enweta azịza efu.

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

Ka anyị chọpụta ihe mere nke a ji eme. Ọ bụrụ na imepe ndekọ ahụ, ị ​​​​nwere ike ịhụ na nsogbu ahụ metụtara SELinux. Ebe ọ bụ na anyị na-agba daemon nke ọ nweghị amụma emepụtara, akara ya dị ka init_t. Ka anyị nwalee tiori a na omume.

sudo setenforce 0

Ihe ndị a niile nwere ike ịkpata nkatọ na anya mmiri nke ọbara, mana nke a bụ naanị debugging prototype. Ka anyị gbanyụọ nlele ahụ naanị iji hụ na nke a bụ nsogbu, mgbe nke ahụ gasịrị, anyị ga-eweghachi ihe niile n'ọnọdụ ya.

Site na ime ka ibe ahụ dị ọhụrụ na ihe nchọgharị ma ọ bụ na-emegharị iwu curl anyị, ị nwere ike ịhụ ibe ule Django.

Yabụ, n'ịhụ na ihe niile na-arụ ọrụ na enweghị nsogbu ikike ọzọ, anyị na-eme ka SELinux ọzọ.

sudo setenforce 1

Agaghị m ekwu maka audit2allow ma ọ bụ mepụta amụma dabere na sepolgen ebe a, ebe ọ bụ na ọ nweghị ngwa Django n'ezie ugbu a, yabụ enweghị maapụ zuru oke nke ihe Gunicorn nwere ike ịchọ ịnweta yana ihe ọ kwesịrị ịjụ ịnweta. Ya mere, ọ dị mkpa ka SELinux na-agba ọsọ iji chebe usoro ahụ, ma n'otu oge ahụ na-ekwe ka ngwa ahụ na-agba ọsọ ma hapụ ozi na ndekọ nyocha ka e wee nwee ike ịmepụta iwu n'ezie site na ha.

Na-akọwapụta ngalaba ikike

Ọ bụghị onye ọ bụla anụla maka ngalaba ikike na SELinux, mana ha abụghị ihe ọhụrụ. Ọtụtụ n’ime ha so ha rụkọọ ọrụ n’amaghịdị ya. Mgbe emepụtara amụma dabere na ozi nyocha, amụma emepụtara na-anọchi anya ngalaba edoziziri. Ka anyị gbalịa ịmepụta usoro inye ikike dị mfe.

Iji mepụta ngalaba anabatara maka Gunicorn, ịchọrọ ụdị amụma, yana ị ga-achọkwa akara faịlụ kwesịrị ekwesị. Na mgbakwunye, a chọrọ ngwá ọrụ iji chịkọta iwu ọhụrụ.

sudo yum install selinux-policy-devel

Usoro ngalaba a na-anabata bụ ngwá ọrụ dị ukwuu maka ịchọpụta nsogbu, karịsịa ma a bịa na ngwa omenala ma ọ bụ ngwa na-ebufe na-enweghị atumatu emebela. N'okwu a, iwu ngalaba anabatara maka Gunicorn ga-adị mfe dị ka o kwere mee - kwupụta ụdị isi (gunicorn_t), kwupụta ụdị anyị ga-eji akara otutu executables (gunicorn_exec_t), wee guzobe mgbanwe maka sistemu akara nke ọma. usoro na-agba ọsọ . Ahịrị ikpeazụ na-edobe amụma ahụ dị ka ndabara nyere ya aka n'oge ebugoro ya.

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;

Ị nwere ike chịkọta faịlụ iwu a ma tinye ya na sistemụ gị.

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

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

Ka anyị lelee ma SELinux na-egbochi ihe ọzọ karịa ihe daemon anyị amaghị na-enweta.

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 na-egbochi Nginx ide data na oghere UNIX nke Gunicorn ji. Dịka, n'ọnọdụ ndị dị otú ahụ, atumatu na-amalite ịgbanwe, mana enwere ihe ịma aka ndị ọzọ dị n'ihu. Ị nwekwara ike ịgbanwe ngalaba ntọala site na ngalaba mmachi gaa na ngalaba ikike. Ugbu a, ka anyị kwaga httpd_t gaa na ngalaba ikike. Nke a ga-enye Nginx ohere dị mkpa ma anyị nwere ike ịga n'ihu na-arụ ọrụ nbipu ọzọ.

sudo semanage permissive -a httpd_t

Ya mere, ozugbo ị jisiri ike na-echekwa SELinux (ị gaghị ahapụ ọrụ SELinux na ọnọdụ mmachibidoro) na ngalaba ikike na-ebufe, ịkwesịrị ịchọpụta ihe kwesịrị ekwesị ka akara ya dị ka gunicorn_exec_t iji nweta ihe niile na-arụ ọrụ nke ọma. ọzọ. Ka anyị nwaa ịga na webụsaịtị ka ịhụ ozi ọhụrụ gbasara mmachi ohere.

sudo ausearch -m AVC -c gunicorn

Ị ga-ahụ ọtụtụ ozi nwere 'comm="gunicorn"' na-eme ihe dị iche iche na faịlụ na /srv/djangoapp, yabụ na nke a doro anya bụ otu n'ime iwu kwesịrị ọkọlọtọ.

Mana na mgbakwunye, ozi dị ka nke a na-apụta:

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

Ọ bụrụ na ilele ọnọdụ nke ọrụ gunicorn ma ọ bụ na-agba ọsọ iwu ps, ị gaghị ahụ usoro ọ bụla na-agba ọsọ. Ọ dị ka gunicorn na-agbalị ịnweta onye ntụgharị okwu Python na gburugburu virtualenv anyị, ikekwe iji mee edemede ndị ọrụ. Ya mere ugbu a, ka anyị kaa akara faịlụ abụọ a nwere ike ime ma lelee ma anyị nwere ike imepe ibe ule Django anyị.

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

Ọ ga-adị mkpa ka ịmalitegharị ọrụ gunicorn tupu enwee ike họrọ mkpado ọhụrụ. Ị nwere ike ịmalitegharị ya ozugbo ma ọ bụ kwụsị ọrụ ahụ wee hapụ oghere ka ọ malite mgbe imepe saịtị ahụ na ihe nchọgharị ahụ. Nyochaa na usoro enwetala akara ziri ezi site na iji ps.

ps -efZ | grep gunicorn

Echefula imepụta iwu SELinux nkịtị ma emechaa!

Ọ bụrụ na ị lelee ozi AVC ugbu a, ozi ikpeazụ nwere ikike = 1 maka ihe ọ bụla metụtara ngwa, yana ikike = 0 maka sistemụ ndị ọzọ. Ọ bụrụ na ị ghọtara ụdị ịnweta ezigbo ngwa chọrọ, ị nwere ike ịchọta ngwa ngwa kachasị mma iji dozie nsogbu ndị dị otú ahụ. Mana ruo mgbe ahụ, ọ kacha mma idobe sistemu ahụ wee nweta nyocha doro anya, nke enwere ike iji rụọ ọrụ nke Django.

sudo ausearch -m AVC

Emere!

Ọrụ Django na-arụ ọrụ apụtala na ihu ihu dabere na Nginx na Gunicorn WSGI. Anyị haziri Python 3 na PostgreSQL 10 site na ebe nchekwa RHEL 8 Beta. Ugbu a, ị nwere ike ịga n'ihu wee mepụta (ma ọ bụ naanị tinye) ngwa Django ma ọ bụ nyochaa ngwaọrụ ndị ọzọ dị na RHEL 8 Beta iji megharịa usoro nhazi ahụ, melite arụmọrụ, ma ọ bụ ọbụna tinye nhazi a.

isi: www.habr.com

Tinye a comment