Bùth-obrach RHEL 8 Beta: A’ togail thagraidhean lìn obrach

Tha RHEL 8 Beta a’ tabhann mòran fheartan ùra do luchd-leasachaidh, agus dh’ fhaodadh an liostadh duilleagan a ghabhail, ge-tà, tha ionnsachadh rudan ùra an-còmhnaidh nas fheàrr ann an cleachdadh, agus mar sin gu h-ìosal tha sinn a’ tabhann bùth-obrach air cruthachadh bun-structar tagraidh stèidhichte air Red Hat Enterprise Linux 8 Beta.

Bùth-obrach RHEL 8 Beta: A’ togail thagraidhean lìn obrach

Gabhamaid Python, cànan prògramaidh mòr-chòrdte am measg luchd-leasachaidh, mar bhunait, measgachadh de Django agus PostgreSQL, measgachadh gu math cumanta airson tagraidhean a chruthachadh, agus rèitich RHEL 8 Beta gus obrachadh còmhla riutha. An uairsin cuiridh sinn dhà no dhà eile de ghrìtheid (neo-sheòrsaichte).

Atharraichidh an àrainneachd deuchainn, oir tha e inntinneach sgrùdadh a dhèanamh air comasachd fèin-ghluasaid, obrachadh le soithichean agus àrainneachdan fheuchainn le ioma-fhrithealaiche. Gus tòiseachadh le pròiseact ùr, faodaidh tu tòiseachadh le bhith a’ cruthachadh prototype beag, sìmplidh le làimh gus am faic thu gu dìreach dè a dh’ fheumas tachairt agus mar a bhios e ag eadar-obrachadh, agus an uairsin gluais air adhart gu fèin-ghluasad agus cruthaich rèiteachaidhean nas iom-fhillte. An-diugh tha sinn a 'bruidhinn mu dheidhinn cruthachadh a leithid de prototype.

Feuch an tòisich sinn le bhith a’ cleachdadh ìomhaigh RHEL 8 Beta VM. Faodaidh tu inneal brìgheil a chuir a-steach bhon fhìor thoiseach, no cleachd an ìomhaigh aoigh KVM a tha ri fhaighinn leis an fho-sgrìobhadh Beta agad. Nuair a bhios tu a’ cleachdadh ìomhaigh aoigh, feumaidh tu CD brìgheil a rèiteachadh anns am bi meata-dàta agus dàta cleachdaiche airson tùsachadh sgòthan (cloud-init). Chan fheum thu dad sònraichte a dhèanamh le structar an diosc no na pacaidean a tha rim faighinn; nì rèiteachadh sam bith.

Bheir sinn sùil nas mionaidiche air a 'phròiseas gu lèir.

Django a stàladh

Leis an dreach as ùire de Django, bidh feum agad air àrainneachd bhrìgheil (virtualenv) le Python 3.5 no nas fhaide air adhart. Anns na notaichean Beta chì thu gu bheil Python 3.6 ri fhaighinn, feuch an dèan sinn cinnteach a bheil seo fìor:

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

Bidh Red Hat gu gnìomhach a’ cleachdadh Python mar inneal siostam ann an RHEL, mar sin carson a tha seo mar thoradh?

Is e an fhìrinn gu bheil mòran de luchd-leasachaidh Python fhathast a’ beachdachadh air gluasad bho Python 2 gu Python 2, fhad ‘s a tha Python 3 fhèin fo leasachadh gnìomhach, agus tha barrachd is barrachd dhreachan ùra a’ nochdadh an-còmhnaidh. Mar sin, gus coinneachadh ris an fheum air innealan siostam seasmhach fhad ‘s a bha iad a’ toirt cothrom do luchd-cleachdaidh air diofar dhreachan ùra de Python, chaidh siostam Python a ghluasad a-steach do phasgan ùr agus thug e seachad an comas an dà chuid Python 2.7 agus 3.6 a stàladh. Gheibhear tuilleadh fiosrachaidh mu na h-atharrachaidhean agus carson a chaidh an dèanamh anns an fhoillseachadh ann an Blog Langdon White (Langdon Geal).

Mar sin, gus Python a dhèanamh ag obair, chan fheum thu ach dà phacaid a chuir a-steach, le python3-pip air a ghabhail a-steach mar eisimeileachd.

sudo yum install python36 python3-virtualenv

Carson nach cleachd thu fiosan modal dìreach mar a tha Langdon a’ moladh agus stàlaich pip3? Le bhith a’ cumail cuimhne air an fèin-ghluasad a tha ri thighinn, tha fios gum feum Ansible pip a chuir a-steach airson a ruith, leis nach eil am modal pip a’ toirt taic do virtualenvs le pip àbhaisteach a ghabhas coileanadh.

Le eadar-theangair python3 ag obair dhut, faodaidh tu leantainn air adhart le pròiseas stàlaidh Django agus siostam obrach a bhith agad còmhla ris na co-phàirtean eile againn. Tha mòran roghainnean buileachaidh rim faighinn air an eadar-lìn. Tha aon dreach air a thaisbeanadh an seo, ach faodaidh luchd-cleachdaidh na pròiseasan aca fhèin a chleachdadh.

Stàlaichidh sinn na dreachan PostgreSQL agus Nginx a tha rim faighinn ann an RHEL 8 gu bunaiteach a ’cleachdadh Yum.

sudo yum install nginx postgresql-server

Feumaidh PostgreSQL psycopg2, ach feumaidh e a bhith ri fhaighinn a-mhàin ann an àrainneachd virtualenv, agus mar sin cuiridh sinn a-steach e le bhith a’ cleachdadh pip3 còmhla ri Django agus Gunicorn. Ach an toiseach feumaidh sinn virtualenv a stèidheachadh.

Tha an-còmhnaidh tòrr deasbaid ann air a’ chuspair a bhith a’ taghadh an àite cheart airson pròiseactan Django a chuir a-steach, ach nuair a tha teagamh ann, faodaidh tu an-còmhnaidh tionndadh gu Inbhe rangachd Linux Filesystem. Gu sònraichte, tha an FHS ag ràdh gu bheil / srv air a chleachdadh airson: “dàta aoigheachd sònraichte a stòradh - dàta a bhios an siostam a’ dèanamh, leithid dàta frithealaiche lìn agus sgriobtaichean, dàta air a stòradh air frithealaichean FTP, agus stòran siostam smachd. ” dreachan (a’ nochdadh ann am FHS -2.3 ann an 2004).

Is e seo dìreach ar cùis, agus mar sin chuir sinn a h-uile dad a dh’ fheumas sinn a-steach / srv, a tha le neach-cleachdaidh an tagraidh againn (cleachdaiche sgòthan).

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

Tha e furasta PostgreSQL agus Django a stèidheachadh: cruthaich stòr-dàta, cruthaich cleachdaiche, rèitich ceadan. Is e aon rud ri chumail nad inntinn nuair a stàlaicheas tu PostgreSQL an toiseach an sgriobt postgresql-setup a tha air a chuir a-steach leis a’ phacaid postgresql-server. Cuidichidh an sgriobt seo thu gus gnìomhan bunaiteach a choileanadh co-cheangailte ri rianachd cnuasachadh stòr-dàta, leithid tòiseachadh brabhsair no am pròiseas ùrachadh. Gus eisimpleir PostgreSQL ùr a rèiteachadh air siostam RHEL, feumaidh sinn an àithne a ruith:

sudo /usr/bin/postgresql-setup -initdb

Faodaidh tu an uairsin tòiseachadh air PostgreSQL a ’cleachdadh systemd, cruthaich stòr-dàta, agus stèidhich pròiseact ann an Django. Cuimhnich gun ath-thòisich PostgreSQL às deidh dhut atharrachaidhean a dhèanamh air faidhle rèiteachaidh dearbhaidh teachdaiche (mar as trice pg_hba.conf) gus stòradh facal-faire a rèiteachadh airson neach-cleachdaidh an tagraidh. Ma thachras tu air duilgheadasan eile, dèan cinnteach gun atharraich thu na roghainnean IPv4 agus IPv6 anns an fhaidhle 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

Anns an fhaidhle /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

Anns an fhaidhle /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 }}',
   }
}

Às deidh dhut am faidhle settings.py a rèiteachadh sa phròiseact agus rèiteachadh an stòr-dàta a stèidheachadh, faodaidh tu tòiseachadh air an fhrithealaiche leasachaidh gus dèanamh cinnteach gu bheil a h-uile dad ag obair. Às deidh dhut am frithealaiche leasachaidh a thòiseachadh, is e deagh bheachd a th’ ann cleachdaiche rianachd a chruthachadh gus an ceangal ris an stòr-dàta a dhearbhadh.

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

WSGI? Wai?

Tha am frithealaiche leasachaidh feumail airson deuchainn, ach gus an aplacaid a ruith feumaidh tu am frithealaiche agus an neach-ionaid iomchaidh a rèiteachadh airson an Web Server Gateway Interface (WSGI). Tha grunn choimeasgaidhean cumanta ann, mar eisimpleir, Apache HTTPD le uWSGI no Nginx le Gunicorn.

Is e obair an Web Server Gateway Interface iarrtasan bhon t-seirbheisiche lìn a chuir air adhart gu frèam lìn Python. Tha WSGI na chuimhneachan air an àm a dh'fhalbh uabhasach nuair a bha einnseanan CGI timcheall, agus an-diugh is e WSGI an ìre de facto, ge bith dè an t-seirbheisiche lìn no am frèam Python a chaidh a chleachdadh. Ach a dh'aindeoin a bhith ga cleachdadh gu farsaing, tha mòran nuances ann fhathast nuair a bhios iad ag obair leis na frèaman sin, agus mòran roghainnean. Anns a 'chùis seo, feuchaidh sinn ri eadar-obrachadh a stèidheachadh eadar Gunicorn agus Nginx tro socaid.

Leis gu bheil an dà phàirt sin air an stàladh air an aon fhrithealaiche, feuchaidh sinn ri socaid UNIX a chleachdadh an àite socaid lìonraidh. Leis gu bheil conaltradh feumach air socaid co-dhiù, feuchaidh sinn ri aon cheum eile a ghabhail agus cuir air dòigh gnìomhachd socaid airson Gunicorn tro systemd.

Tha am pròiseas airson seirbheisean socaid gnìomhaichte a chruthachadh gu math sìmplidh. An toiseach, thèid faidhle aonad a chruthachadh anns a bheil stiùireadh ListenStream a’ comharrachadh a’ phuing aig an tèid an socaid UNIX a chruthachadh, an uairsin faidhle aonad airson na seirbheis anns am bi an stiùireadh riatanasan a’ comharrachadh faidhle aonad an t-socaid. An uairsin, ann am faidhle an aonaid seirbheis, chan eil air fhàgail ach Gunicorn a ghairm bhon àrainneachd bhrìgheil agus ceangal WSGI a chruthachadh airson socaid UNIX agus an tagradh Django.

Seo eisimpleirean de fhaidhlichean aonad a dh'fhaodas tu a chleachdadh mar bhunait. An toiseach chuir sinn air dòigh an t-socaid.

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

A-nis feumaidh tu an daemon Gunicorn a rèiteachadh.

[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

Airson Nginx, tha e na chùis shìmplidh faidhlichean rèiteachaidh neach-ionaid a chruthachadh agus eòlaire a stèidheachadh gus susbaint statach a stòradh ma tha thu a’ cleachdadh fear. Ann an RHEL, tha faidhlichean rèiteachaidh Nginx suidhichte ann an /etc/nginx/conf.d. Faodaidh tu an eisimpleir a leanas a chopaigeadh a-steach don fhaidhle /etc/nginx/conf.d/default.conf agus an t-seirbheis a thòiseachadh. Dèan cinnteach gun cuir thu an server_name a rèir an ainm aoigheachd agad.

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òisich an t-socaid Gunicorn agus Nginx a 'cleachdadh systemd agus tha thu deiseil airson tòiseachadh air deuchainn.

Mearachd Droch Gateway?

Ma chuireas tu a-steach an seòladh a-steach don bhrobhsair agad, is coltaiche gum faigh thu mearachd 502 Bad Gateway. Is dòcha gu bheil e air adhbhrachadh le ceadan socaid UNIX a chaidh a rèiteachadh gu ceàrr, no dh’ fhaodadh gu bheil e mar thoradh air cùisean nas iom-fhillte co-cheangailte ri smachd ruigsinneachd ann an SELinux.

Ann an loga mearachd nginx chì thu loidhne mar seo:

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"

Ma nì sinn deuchainn dìreach air Gunicorn, gheibh sinn freagairt falamh.

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

Feuch an obraich sinn a-mach carson a tha seo a’ tachairt. Ma dh’fhosglas tu an loga, tha e glè choltach gum faic thu gu bheil an duilgheadas co-cheangailte ri SELinux. Leis gu bheil sinn a’ ruith daemon far nach deach poileasaidh a chruthachadh air a shon, tha e air a chomharrachadh mar init_t. Feuch an dèan sinn deuchainn air an teòiridh seo ann an cleachdadh.

sudo setenforce 0

Dh'fhaodadh seo uile a bhith ag adhbhrachadh càineadh agus deòir fala, ach tha seo dìreach a 'toirt air falbh am prototype. Leig leinn an t-seic a dhì-cheadachadh dìreach gus dèanamh cinnteach gur e seo an duilgheadas, às deidh sin tillidh sinn a h-uile càil air ais chun àite.

Le bhith ag ùrachadh na duilleige sa bhrobhsair no ag ath-ruith ar n-òrdugh curl, chì thu duilleag deuchainn Django.

Mar sin, às deidh dhuinn dèanamh cinnteach gu bheil a h-uile càil ag obair agus nach eil barrachd dhuilgheadasan cead ann, leigidh sinn SELinux a-rithist.

sudo setenforce 1

Cha bhith mi a’ bruidhinn mu dheidhinn audit2allow no cruthachadh phoileasaidhean rabhaidh le sepolgen an seo, leis nach eil fìor thagradh Django ann an-dràsta, agus mar sin chan eil mapa iomlan ann de na dh’ fhaodadh Gunicorn a bhith ag iarraidh faighinn a-steach agus dè a bu chòir dha ruigsinneachd a dhiùltadh. Mar sin, feumar SELinux a chumail a’ ruith gus an siostam a dhìon, agus aig an aon àm leigeil leis an tagradh teachdaireachdan a ruith agus fhàgail anns an log sgrùdaidh gus an tèid am fìor phoileasaidh a chruthachadh bhuapa.

A 'sònrachadh raointean ceadaichte

Chan eil a h-uile duine air cluinntinn mu raointean ceadaichte ann an SELinux, ach chan eil iad dad ùr. Bha mòran eadhon ag obair còmhla riutha gun eadhon ga thuigsinn. Nuair a thèid poileasaidh a chruthachadh stèidhichte air teachdaireachdan sgrùdaidh, tha am poileasaidh cruthaichte a’ riochdachadh an raon fuasglaidh. Feuchaidh sinn ri poileasaidh ceadachaidh sìmplidh a chruthachadh.

Gus àrainn ceadaichte sònraichte a chruthachadh airson Gunicorn, feumaidh tu seòrsa de phoileasaidh, agus feumaidh tu cuideachd na faidhlichean iomchaidh a chomharrachadh. A bharrachd air an sin, tha feum air innealan gus poileasaidhean ùra a chur ri chèile.

sudo yum install selinux-policy-devel

Tha an uidheamachd raointean ceadaichte na inneal math airson duilgheadasan a chomharrachadh, gu sònraichte nuair a thig e gu tagradh àbhaisteach no tagraidhean a thèid a chuir air falbh gun phoileasaidhean a chaidh a chruthachadh mar-thà. Anns a ’chùis seo, bidh am poileasaidh fearainn ceadaichte airson Gunicorn cho sìmplidh‘ s a ghabhas - cuir an cèill prìomh sheòrsa (gunicorn_t), cuir an cèill an seòrsa a chleachdas sinn gus iomadh gnìomh a chomharrachadh (gunicorn_exec_t), agus an uairsin cuir air dòigh eadar-ghluasad airson siostam a chomharrachadh gu ceart pròiseasan ruith. Tha an loidhne mu dheireadh a’ suidheachadh a’ phoileasaidh mar a tha e air a chomasachadh gu bunaiteach aig an àm a thèid a luchdachadh.

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;

Faodaidh tu am faidhle poileasaidh seo a chur ri chèile agus a chur ris an t-siostam agad.

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

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

Feuch an dèan sinn cinnteach a bheil SELinux a’ bacadh rudeigin eile a bharrachd air na tha an daemon neo-aithnichte againn a’ faighinn cothrom.

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

Tha SELinux a’ cur casg air Nginx bho bhith a’ sgrìobhadh dàta gu socaid UNIX a bhios Gunicorn a’ cleachdadh. Mar as trice, ann an leithid de chùisean, bidh poileasaidhean a’ tòiseachadh ag atharrachadh, ach tha dùbhlain eile romhainn. Faodaidh tu cuideachd na roghainnean àrainn atharrachadh bho àrainn cuibhreachaidh gu àrainn cead. A-nis gluaisidh sinn httpd_t gu raon nan ceadan. Bheir seo an ruigsinneachd riatanach do Nginx agus is urrainn dhuinn leantainn air adhart le tuilleadh obair deasbaid.

sudo semanage permissive -a httpd_t

Mar sin, aon uair ‘s gu bheil thu air SELinux a dhìon (cha bu chòir dhut pròiseact SELinux fhàgail ann am modh cuibhrichte) agus na raointean cead air an luchdachadh, feumaidh tu faighinn a-mach dè dìreach a dh’ fheumar a chomharrachadh mar gunicorn_exec_t gus am bi a h-uile càil ag obair ceart a-rithist. Feuchaidh sinn ri tadhal air an làrach-lìn gus teachdaireachdan ùra fhaicinn mu chuingealachaidhean ruigsinneachd.

sudo ausearch -m AVC -c gunicorn

Chì thu tòrr theachdaireachdan anns a bheil 'comm="gunicorn"' a nì diofar rudan air faidhlichean ann an / srv/djangoapp, agus mar sin tha e follaiseach gur e seo aon de na h-òrdughan as fhiach a chomharrachadh.

Ach a bharrachd air an sin, nochdaidh teachdaireachd mar seo:

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

Ma choimheadas tu air inbhe seirbheis gunicorn no ma ruitheas tu an òrdugh ps, chan fhaic thu pròiseasan ruith sam bith. Tha e coltach gu bheil gunicorn a’ feuchainn ri faighinn chun eadar-theangair Python san àrainneachd virtualenv againn, is dòcha airson sgriobtaichean luchd-obrach a ruith. Mar sin a-nis comharraich sinn an dà fhaidhle so-ghnìomhaichte seo agus dèan cinnteach an urrainn dhuinn ar duilleag deuchainn Django fhosgladh.

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

Feumar an t-seirbheis gunicorn ath-thòiseachadh mus tèid an taga ùr a thaghadh. Faodaidh tu ath-thòiseachadh sa bhad no stad a chuir air an t-seirbheis agus leig leis an t-socaid tòiseachadh nuair a dh’ fhosglas tu an làrach sa bhrobhsair. Dèan cinnteach gu bheil pròiseasan air na bileagan ceart fhaighinn a’ cleachdadh ps.

ps -efZ | grep gunicorn

Na dìochuimhnich poileasaidh àbhaisteach SELinux a chruthachadh nas fhaide air adhart!

Ma choimheadas tu air na teachdaireachdan AVC an-dràsta, tha permissive = 1 anns an teachdaireachd mu dheireadh airson a h-uile càil co-cheangailte ris an aplacaid, agus ceadaichte = 0 airson a’ chòrr den t-siostam. Ma tha thu a 'tuigsinn dè an seòrsa ruigsinneachd a dh' fheumas tagradh fìor, faodaidh tu gu luath an dòigh as fheàrr air fuasgladh fhaighinn air duilgheadasan mar sin. Ach gu ruige sin, tha e nas fheàrr an siostam a chumail tèarainte agus sgrùdadh soilleir, feumail fhaighinn air pròiseact Django.

sudo ausearch -m AVC

Thachair!

Tha pròiseact Django ag obair air nochdadh le aghaidh stèidhichte air Nginx agus Gunicorn WSGI. Stèidhich sinn Python 3 agus PostgreSQL 10 bho na stòran RHEL 8 Beta. A-nis faodaidh tu gluasad air adhart agus cruthachadh (no dìreach cleachdadh) tagraidhean Django no sgrùdadh a dhèanamh air innealan eile a tha rim faighinn ann an RHEL 8 Beta gus am pròiseas rèiteachaidh a dhèanamh fèin-ghluasadach, coileanadh adhartachadh, no eadhon an rèiteachadh seo a chumail.

Source: www.habr.com

Cuir beachd ann