Awheawhe RHEL 8 Beta: Te hanga tono tukutuku mahi

Ko te RHEL 8 Beta he maha nga waahanga hou e tuku ana ki nga kaiwhakawhanake, ko te raarangi ka taea te tango i nga wharangi, heoi, he pai ake te ako i nga mea hou i roto i nga mahi, na kei raro nei ka tukuna he awheawhe mo te hanga i tetahi hanganga tono i runga i te Red Hat Enterprise Linux 8 Beta.

Awheawhe RHEL 8 Beta: Te hanga tono tukutuku mahi

Me tango e tatou a Python, he reo whakahiato rongonui i waenga i nga kaiwhakawhanake, hei turanga, he huinga o Django me PostgreSQL, he huinga tino noa mo te hanga tono, me te whirihora i te RHEL 8 Beta hei mahi tahi me ratou. Na ka taapirihia e matou etahi atu kai (kaore ano kia wehewehea).

Ka huri te taiao whakamatautau, na te mea he pai ki te torotoro i nga huarahi o te mahi aunoa, te mahi me nga ipu me nga taiao whakamatautau me nga kaitoro maha. Hei timata i tetahi kaupapa hou, ka taea e koe te timata ma te hanga i tetahi tauira iti, ngawari ma te ringaringa kia kite koe i nga mea e tika ana kia tupu me te pehea o te taunekeneke, katahi ka neke ki te mahi aunoa me te hanga whirihoranga uaua ake. I tenei ra e korero ana matou mo te hanganga o taua tauira.

Me timata ma te tuku i te ahua RHEL 8 Beta VM. Ka taea e koe te whakauru i tetahi miihini mariko mai i te wahanga, te whakamahi ranei i te ahua manuhiri KVM e waatea ana me to ohaurunga Beta. Ina whakamahi pikitia manuhiri, me whirihora e koe he CD mariko ka mau metadata me nga raraunga kaiwhakamahi mo te arawhitinga kapua (cloud-init). Kare koe e hiahia ki te mahi i tetahi mea motuhake ki te hanganga kōpae me nga kohinga e waatea ana; ka taea e koe te whirihoranga.

Kia ata titiro tatou ki te mahi katoa.

Tāuta Django

Ma te putanga hou o Django, ka hiahia koe ki te taiao mariko (virtualenv) me te Python 3.5 ranei i muri mai. I roto i nga tuhipoka Beta ka kite koe kei te waatea a Python 3.6, me tirotiro mena koinei te take:

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

Kei te kaha te whakamahi a Red Hat i te Python hei kete taputapu i roto i te RHEL, na te aha i puta ai tenei?

Ko te meka he maha nga kaiwhakawhanake Python e whakaaro tonu ana ki te whakawhiti mai i te Python 2 ki te Python 2, ko te Python 3 ano kei raro i te whakawhanaketanga kaha, me te maha atu o nga putanga hou kei te puta tonu. Na reira, ki te whakatutuki i te hiahia mo nga taputapu punaha pumau i te wa e tuku ana nga kaiwhakamahi ki te uru ki nga momo momo putanga hou o Python, i nukuhia te punaha Python ki roto i tetahi kete hou me te whai waahi ki te whakauru i te Python 2.7 me te 3.6. Ka kitea etahi atu korero mo nga huringa me te take i mahia ai i roto i te whakaputanga i Te rangitaki a Langdon White (Langdon White).

Na, ki te mahi Python, me whakauru noa e koe nga kete e rua, me te python3-pip kua whakauruhia hei whakawhirinakitanga.

sudo yum install python36 python3-virtualenv

He aha te take e kore ai e whakamahi i nga waea waea tika i te whakaaro a Langdon me te whakauru i te pip3? Ma te maumahara ki te mahi aunoatanga e haere ake nei, e mohio ana ka hiahia a Ansible ki te whakauru i te pip ki te whakahaere, na te mea kaore te pip e tautoko i nga virtualenvs me te pip ritenga ka taea te whakahaere.

Ma te kaiwhakamaori python3 kei a koe, ka taea e koe te haere tonu ki te whakaurunga Django me te whai punaha mahi me etahi atu waahanga. He maha nga waahanga whakatinanatanga kei runga i te Ipurangi. Kotahi te putanga kua whakaatuhia ki konei, engari ka taea e nga kaiwhakamahi te whakamahi i a raatau ake mahi.

Ka whakauruhia e matou nga putanga PostgreSQL me Nginx e waatea ana i RHEL 8 ma te taunoa ma te whakamahi i te Yum.

sudo yum install nginx postgresql-server

Ka hiahiatia e PostgreSQL te psycopg2, engari me waatea noa i roto i te taiao mariko, no reira ka whakauruhia e matou ma te whakamahi i te pip3 me Django me Gunicorn. Engari ko te tuatahi me whakarite maatau virtualenv.

He maha tonu nga tautohetohe mo te kaupapa mo te whiriwhiri i te waahi tika ki te whakauru i nga kaupapa Django, engari i te wa e ruarua ana, ka taea e koe te huri ki te Linux Filesystem Hierarchy Standard. E ai ki te FHS, ka whakamahia te /srv ki: "whakaahua i nga raraunga kaihautu-motuhake - nga raraunga ka whakaputahia e te punaha, penei i nga raraunga tūmau tukutuku me nga tuhinga tuhi, nga raraunga kei runga i nga tūmau FTP, me te whakahaere i nga putunga punaha." putanga (ka puta i te FHS -2.3 i te tau 2004).

Koinei tonu ta matou keehi, no reira ka tukuna e matou nga mea katoa e hiahiatia ana e matou ki roto / srv, na ta matou kaiwhakamahi tono (kaiwhakamahi kapua).

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

He ngawari te whakatu i te PostgreSQL me te Django: hanga he papaa raraunga, hanga he kaiwhakamahi, whirihora whakaaetanga. Ko tetahi mea hei maumahara i te wa e whakauru ana i te PostgreSQL i te tuatahi ko te tuhinga whakatuu-postgresql kua whakauruhia ki te kete pou-tūmau-postgresql. Ka awhina tenei hōtuhi ki a koe ki te mahi i nga mahi taketake e pa ana ki te whakahaerenga huinga huinga raraunga, penei i te arawhiti huinga, te tukanga whakamohoatanga ranei. Hei whirihora i tetahi tauira PostgreSQL hou i runga i te punaha RHEL, me whakahaere te whakahau:

sudo /usr/bin/postgresql-setup -initdb

Ka taea e koe te tiimata i te PostgreSQL ma te whakamahi i te systemd, te hanga i tetahi papaa raraunga, ka whakarite kaupapa ki Django. Kia mahara ki te whakaara ano i te PostgreSQL i muri i te whakarereketanga i te konae whirihoranga motuhēhēnga a te kiritaki (te nuinga o pg_hba.conf) hei whirihora i te rokiroki kupuhipa mo te kaiwhakamahi tono. Mena ka pa ki etahi atu uauatanga, me whakarereke i nga tautuhinga IPv4 me IPv6 i te pg_hba.conf kōnae.

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

I roto i te konae /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

I roto i te konae /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 }}',
   }
}

I muri i te whirihora i te kōnae settings.py i roto i te kaupapa me te whakarite i te whirihoranga raraunga, ka taea e koe te timata i te tūmau whanaketanga kia mohio kei te mahi nga mea katoa. I muri i te tiimata i te tūmau whanaketanga, he pai te whakaaro ki te hanga i tetahi kaiwhakamahi kaiwhakahaere hei whakamatautau i te hononga ki te papaarangi.

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

WSGI? Wai?

He pai te tūmau whanaketanga mo te whakamatautau, engari hei whakahaere i te tono me whirihora e koe te tūmau me te takawaenga e tika ana mo te Atanga Waarangi Tukutuku Tukutuku (WSGI). He maha nga huinga noa, hei tauira, Apache HTTPD me uWSGI, Nginx ranei me Gunicorn.

Ko te mahi a te Atanga Waahi Tukutuku Tukutuku he tuku tono mai i te tūmau tukutuku ki te angamahi tukutuku Python. Ko te WSGI he relic o nga wa o mua i te wa e noho ana nga miihini CGI, a i tenei ra ko WSGI te paerewa pono, ahakoa he aha te tuunga paetukutuku me te anga Python i whakamahia. Engari ahakoa te whanuitanga o tana whakamahinga, he maha tonu nga ahuatanga i te wa e mahi ana me enei anga, me te maha o nga whiringa. I tenei keehi, ka ngana taatau ki te whakarite i te taunekeneke i waenga i a Gunicorn me Nginx ma te turanga.

I te mea kua whakauruhia enei waahanga e rua ki runga i te tūmau kotahi, me ngana ki te whakamahi i te turanga UNIX hei utu mo te turanga whatunga. I te mea ka hiahia te whakawhitiwhiti korero mo tetahi take, me ngana ki te mahi i tetahi atu taahiraa me te whirihora i te whakahohenga turanga mo Gunicorn ma te punaha.

He tino ngawari te tukanga o te hanga i nga ratonga kua whakahohehia. Tuatahi, ka hangaia he konae waeine kei roto he tohutohu ListenStream e tohu ana ki te waahi ka hangaia te turanga UNIX, katahi he konae wae mo te ratonga ka tohu te tohutohu Titau ki te konae waeine turanga. Na, i roto i te konae waahanga ratonga, ko nga mea katoa e toe ana ko te waea atu ki a Gunicorn mai i te taiao mariko me te hanga i tetahi herenga WSGI mo te turanga UNIX me te tono Django.

Anei etahi tauira o nga konae waeine ka taea e koe te whakamahi hei turanga. Tuatahi ka whakaturia e matou te turanga.

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Inaianei me whirihora e koe te daemon Gunicorn.

[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

Mo Nginx, he mea ngawari ki te hanga i nga konae whirihoranga takawaenga me te whakatu i tetahi raarangi hei penapena ihirangi pateko mena kei te whakamahi koe i tetahi. I roto i te RHEL, kei roto nga konae whirihoranga Nginx i /etc/nginx/conf.d. Ka taea e koe te kape i te tauira e whai ake nei ki te konae /etc/nginx/conf.d/default.conf ka tiimata te ratonga. Me whakarite te ingoa_server kia rite ki to ingoa kaihautu.

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

Tīmatahia te turanga Gunicorn me te Nginx ma te whakamahi i te systemd ka rite koe ki te timata ki te whakamatautau.

Hapa Gateway kino?

Mena ka whakauru koe i te wahitau ki to kaitirotiro, ka whiwhi koe i te hapa 502 Bad Gateway. Na te he o te whirihora i nga whakaaetanga turanga UNIX, na nga take uaua ake e pa ana ki te mana uru ki SELinux.

I roto i te raarangi hapa nginx ka kite koe i tetahi raina penei:

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"

Mena ka whakamatau tika tatou i a Gunicorn, ka whiwhi tatou i te whakautu kore.

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

Kia mohio tatou he aha i puta ai tenei. Mena ka whakatuwherahia e koe te raarangi, ka kite pea koe ko te raru e pa ana ki a SELinux. I te mea kei te whakahaere tatou i te daemon karekau he kaupapa here i hanga, kua tohua hei init_t. Kia whakamatauria tenei ariā i roto i te mahi.

sudo setenforce 0

Ko enei mea katoa ka puta te whakahee me te roimata o te toto, engari kei te tarai noa tenei i te tauira. Me whakakorehia te haki kia mohio ai koinei te raru, ka mutu ka whakahokia nga mea katoa ki tona waahi.

Ma te whakamau i te wharangi i roto i te kaitirotiro me te whakahoki ano i ta maatau whakahau curl, ka kite koe i te whaarangi whakamatautau Django.

Na, i te mohio kei te mahi nga mea katoa kaore he raruraru whakaaetanga, ka taea ano e matou a SELinux.

sudo setenforce 1

E kore ahau e korero mo te audit2allow me te hanga kaupapa-a-mataara me te sepolgen i konei, na te mea kaore he tono a Django i tenei wa, na reira kaore he mapi katoa o nga mea e hiahia ana a Gunicorn ki te uru atu me te aha e kore e uru atu. Na reira, he mea tika kia haere tonu a SELinux ki te tiaki i te punaha, i te wa ano ka tuku i te tono ki te whakahaere me te waiho i nga karere i roto i te raarangi arotake kia taea ai te hanga kaupapa here tuturu mai i a raatau.

Te tautuhi i nga rohe whakaae

Kaore nga tangata katoa i rongo mo nga waahi kua whakaaetia i SELinux, engari ehara i te mea hou. He tokomaha i mahi tahi me ratou me te kore e mohio. Ina hangaia he kaupapa here i runga i nga karere arotake, ko te kaupapa here i hangaia hei tohu mo te rohe kua whakatauhia. Me ngana ki te hanga kaupapa here tuku ngawari.

Hei waihanga i tetahi rohe motuhake mo Gunicorn, me hiahia koe ki etahi momo kaupapa here, me tohu ano koe i nga konae e tika ana. I tua atu, ka hiahiatia nga taputapu ki te kohikohi kaupapa here hou.

sudo yum install selinux-policy-devel

Ko te tikanga o nga rohe e whakaaetia ana he taputapu pai mo te tautuhi i nga raru, ina koa ka tae mai ki te tono ritenga, ki nga tono ranei ka tukuna kaore he kaupapa here kua hangaia. I tenei keehi, he maamaa noa te kaupapa here rohe mo Gunicorn - whakapuakihia he momo matua (gunicorn_t), whakapuakihia he momo ka whakamahia e matou hei tohu i te maha o nga whakahaere (gunicorn_exec_t), katahi ka whakarite i te whakawhiti mo te punaha ki te tohu tika. whakahaere tukanga. Ko te rarangi whakamutunga ka tautuhi i te kaupapa here kia taea ai te taunoa i te wa e utaina ana.

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;

Ka taea e koe te whakahiato i tenei konae kaupapa here me te taapiri atu ki to punaha.

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

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

Kia tirohia mena kei te aukati a SELinux i tetahi atu mea ke atu i ta taatau daemon e kore e mohiotia e uru ana.

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

Ka aukati a SELinux i a Nginx ki te tuhi raraunga ki te turanga UNIX i whakamahia e Gunicorn. Ko te tikanga, i roto i nga ahuatanga penei, ka timata nga kaupapa here ki te huri, engari tera ano etahi atu wero kei mua. Ka taea hoki te huri i nga tautuhinga rohe mai i te rohe here ki te rohe whakaaetanga. Inaianei me neke te httpd_t ki te rohe whakaaetanga. Ma tenei ka hoatu ki a Nginx te urunga e tika ana ka taea e taatau te haere tonu ki te mahi patuiro.

sudo semanage permissive -a httpd_t

Na, ka taea e koe te tiaki i a SELinux (kaore koe e waiho he kaupapa SELinux i roto i te aratau aukati) ka utaina nga rohe whakaaetanga, me whakaaro koe he aha nga mea e tika ana kia tohua hei gunicorn_exec_t kia pai ai te mahi o nga mea katoa. ano. Me ngana ki te toro ki te paetukutuku ki te kite i nga karere hou mo te aukati uru.

sudo ausearch -m AVC -c gunicorn

Ka kite koe i te maha o nga panui kei roto 'comm="gunicorn"' e mahi ana i nga momo mahi i runga i nga konae kei / srv/djangoapp, no reira koinei tetahi o nga whakahau e tika ana kia haki.

Engari i tua atu, ka puta he karere penei:

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

Mena ka titiro koe ki te mana o te ratonga gunicorn, ki te whakahaere ranei i te whakahau ps, kaore koe e kite i nga tikanga whakahaere. Te ahua nei kei te ngana a gunicorn ki te uru atu ki te kaiwhakamaori Python i roto i to maatau taiao mariko, tera pea ki te whakahaere i nga tuhinga a nga kaimahi. Na, me tohu enei konae e rua ka taea te whakahaere me te tirotiro mena ka taea e taatau te whakatuwhera i ta maatau wharangi whakamatautau Django.

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

Me whakaara ano te ratonga gunicorn i mua i te kowhiri i te tohu tohu hou. Ka taea e koe te whakaara ano, ka mutu ranei te ratonga ka waiho te turanga kia timata ina whakatuwhera koe i te pae i roto i te tirotiro. Manatokohia kua whiwhi nga tukanga i nga tapanga tika ma te whakamahi i te ps.

ps -efZ | grep gunicorn

Kaua e wareware ki te hanga kaupapa here SELinux noa i muri mai!

Mena ka titiro koe ki nga karere AVC inaianei, kei roto i te karere whakamutunga he whakaaetanga=1 mo nga mea katoa e pa ana ki te tono, me te whakaaetanga=0 mo te toenga o te punaha. Mena ka mohio koe he aha te ahua o te urunga e hiahiatia ana e te tono pono, ka taea e koe te rapu tere i te huarahi pai ki te whakaoti rapanga penei. Engari tae noa ki tera wa, he pai ki te pupuri i te punaha me te whiwhi i te arotakenga marama me te whakamahi mo te kaupapa Django.

sudo ausearch -m AVC

Kua tupu!

Kua puta mai he kaupapa mahi Django me te taha o mua i runga i te Nginx me te Gunicorn WSGI. I whirihorahia e matou te Python 3 me te PostgreSQL 10 mai i nga putunga RHEL 8 Beta. Inaianei ka taea e koe te anga whakamua me te hanga (ka toha noa ranei) nga tono Django, te torotoro ranei i etahi atu taputapu e waatea ana i roto i te RHEL 8 Beta ki te whakaaunoa i te tukanga whirihoranga, ki te whakapai ake i nga mahi, ki te whakakii ranei i tenei whirihoranga.

Source: will.com

Tāpiri i te kōrero