Atrikasa RHEL 8 Beta: Manorina fampiharana amin'ny Internet

Ny RHEL 8 Beta dia manolotra endri-javatra vaovao maro ho an'ny mpamorona, ny lisitry izay mety hitondra pejy, na izany aza, ny fianarana zava-baovao dia tsara kokoa amin'ny fampiharana, ka eto ambany dia manolotra atrikasa momba ny famoronana fotodrafitrasa fampiharana mifototra amin'ny Red Hat Enterprise Linux 8 Beta izahay.

Atrikasa RHEL 8 Beta: Manorina fampiharana amin'ny Internet

Andeha horaisintsika ho fototry ny Python, fiteny fandaharana malaza eo amin'ny mpamorona, fitambaran'ny Django sy PostgreSQL, fitambarana mahazatra amin'ny famoronana rindranasa, ary amboary ny RHEL 8 Beta mba hiara-miasa amin'izy ireo. Avy eo dia asiana akora roa (tsy voasokajy).

Hiova ny tontolon'ny fitsapana, satria mahaliana ny mijery ny fahafahan'ny automatique, miasa miaraka amin'ny kaontenera ary manandrana tontolo iainana miaraka amin'ireo mpizara marobe. Mba hanombohana tetikasa vaovao dia azonao atao ny manomboka amin'ny famoronana prototype kely sy tsotra amin'ny tanana mba hahitanao tsara ny zavatra tokony hitranga sy ny fomba ifandraisany, ary avy eo dia miroso amin'ny automatique sy mamorona configuring sarotra kokoa. Ankehitriny isika dia miresaka momba ny famoronana prototype toy izany.

Andao hanomboka amin'ny fametrahana ny sary RHEL 8 Beta VM. Azonao atao ny mametraka milina virtoaly manomboka amin'ny scratch, na mampiasa ny sary vahiny KVM misy amin'ny famandrihana Beta anao. Rehefa mampiasa sary vahiny ianao dia mila manamboatra CD virtoaly izay ahitana metadata sy angona mpampiasa ho an'ny fanombohana rahona (cloud-init). Tsy mila manao zavatra manokana ianao amin'ny firafitry ny kapila na ny fonosana misy;

Andeha hojerentsika akaiky ny dingana manontolo.

Fametrahana Django

Miaraka amin'ny dikan-teny vaovao Django dia mila tontolo virtoaly (virtualenv) miaraka amin'ny Python 3.5 na aoriana ianao. Ao amin'ny naoty Beta dia hitanao fa misy ny Python 3.6, andao hojerentsika raha izany tokoa no izy:

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

Red Hat dia mampiasa Python amin'ny maha-fitaovana rafitra ao amin'ny RHEL, koa nahoana no vokatr'izany?

Ny zava-misy dia maro amin'ireo mpamorona Python no mbola mieritreritra ny hifindra avy amin'ny Python 2 mankany amin'ny Python 2, raha toa kosa ny Python 3 dia eo amin'ny fampandrosoana mavitrika, ary mihamaro hatrany ny dikan-teny vaovao. Noho izany, mba hamenoana ny filana fitaovana rafitra miorina amin'ny fanomezana ny mpampiasa ny fidirana amin'ny dikan-teny Python vaovao isan-karazany, ny rafitra Python dia nafindra tao anaty fonosana vaovao ary nanome fahafahana hametraka Python 2.7 sy 3.6. Ny fampahalalana bebe kokoa momba ny fanovana sy ny antony nanaovana azy ireo dia azo jerena ao amin'ny publication in Ny bilaogin'i Langdon White (Langdon White).

Noho izany, raha te hiasa Python dia mila mametraka fonosana roa fotsiny ianao, miaraka amin'ny python3-pip tafiditra ho fiankinan-doha.

sudo yum install python36 python3-virtualenv

Maninona raha mampiasa antso mivantana araka ny soso-kevitr'i Langdon ary mametraka pip3? Raha mitadidy ny automatique ho avy, dia fantatra fa ny Ansible dia mitaky pip napetraka mba hihazakazaka, satria ny module pip dia tsy manohana virtualenvs miaraka amin'ny pip manokana azo tanterahana.

Miaraka amin'ny mpandika teny python3 miasa eo am-pelatananao, afaka manohy ny fizotry ny fametrahana Django ianao ary manana rafitra miasa miaraka amin'ireo singa hafa. Misy safidy fampiharana maro azo jerena amin'ny Internet. Misy dikan-teny iray aseho eto, fa ny mpampiasa dia afaka mampiasa ny fizotrany manokana.

Hametraka ny PostgreSQL sy Nginx amin'ny RHEL 8 izahay amin'ny alΓ lan'ny fampiasana Yum.

sudo yum install nginx postgresql-server

Ny PostgreSQL dia mitaky psycopg2, saingy tsy maintsy misy afa-tsy amin'ny tontolo virtoalyenv, ka hametraka azy amin'ny pip3 miaraka amin'i Django sy Gunicorn. Fa aloha mila manangana virtualenv isika.

Be dia be foana ny adihevitra momba ny fisafidianana ny toerana mety hametrahana tetikasa Django, fa rehefa misalasala ianao dia afaka mitodika any amin'ny Linux Filesystem Hierarchy Standard. Ny FHS manokana dia milaza fa ny /srv dia ampiasaina amin'ny: "mitahiry angon-drakitra manokana momba ny mpampiantrano - angona vokarin'ny rafitra, toy ny angon-drakitra sy ny script amin'ny mpizara tranonkala, ny angona voatahiry ao amin'ny mpizara FTP, ary ny fitehirizana ny rafitra mifehy." (miseho amin'ny FHS -2.3 tamin'ny 2004).

Izany indrindra no tranga misy anay, noho izany dia apetrakay ao amin'ny /srv izay rehetra ilaintsika, izay an'ny mpampiasa fampiharana (cloud-user).

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

Ny fametrahana PostgreSQL sy Django dia mora: mamorona angon-drakitra, mamorona mpampiasa iray, manamboatra ny fahazoan-dΓ lana. Ny zavatra iray tokony hotadidinao rehefa mametraka PostgreSQL voalohany dia ny script postgresql-setup izay napetraka miaraka amin'ny fonosana postgresql-server. Ity script ity dia manampy anao hanao asa fototra mifandraika amin'ny fitantanana cluster database, toy ny fanombohana cluster na ny fizotran'ny fanavaozana. Raha te hanamboatra ohatra PostgreSQL vaovao amin'ny rafitra RHEL dia mila manatanteraka ny baiko isika:

sudo /usr/bin/postgresql-setup -initdb

Azonao atao ny manomboka PostgreSQL mampiasa systemd, mamorona angon-drakitra ary manangana tetikasa ao Django. Tsarovy ny hamerina indray ny PostgreSQL rehefa avy nanao fanovana amin'ny fisie fanamafisam-peo ho an'ny mpanjifa (matetika pg_hba.conf) mba handrindrana ny fitahirizana tenimiafina ho an'ny mpampiasa fampiharana. Raha sendra fahasahiranana hafa ianao dia ataovy izay hanovana ny fikandrana IPv4 sy IPv6 ao amin'ny rakitra 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

Ao amin'ny rakitra /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

Ao amin'ny rakitra /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 }}',
   }
}

Aorian'ny fametrahana ny fisie settings.py ao amin'ny tetikasa sy ny fametrahana ny configuration database dia azonao atao ny manomboka ny server development mba hahazoana antoka fa mandeha ny zava-drehetra. Aorian'ny fanombohana ny lohamilina fampandrosoana dia tsara ny mamorona mpampiasa admin mba hitsapana ny fifandraisana amin'ny angon-drakitra.

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

WSGI? Wai?

Ny lohamilina fampandrosoana dia ilaina amin'ny fitsapana, fa raha te hampiasa ilay rindranasa dia tsy maintsy amboarina ny mpizara sahaza sy ny proxy ho an'ny Web Server Gateway Interface (WSGI). Misy fitambarana mahazatra maromaro, ohatra, Apache HTTPD miaraka amin'ny uWSGI na Nginx miaraka amin'i Gunicorn.

Ny asan'ny Web Server Gateway Interface dia ny mandefa fangatahana avy amin'ny mpizara tranonkala mankany amin'ny rafitra tranonkala Python. Ny WSGI dia vakoka amin'ny lasa mahatsiravina fony teo amin'ny manodidina ny motera CGI, ary ankehitriny ny WSGI no fenitry ny tena marina, na inona na inona ny mpizara tranonkala na ny rafitra Python ampiasaina. Saingy na dia eo aza ny fampiasany miely patrana, dia mbola misy ny nuances maro rehefa miasa amin'ireo rafitra ireo, ary safidy maro. Amin'ity tranga ity dia hiezaka ny hametraka fifandraisana eo amin'i Gunicorn sy Nginx amin'ny alΓ lan'ny socket isika.

Koa satria ireo singa roa ireo dia napetraka amin'ny lohamilina iray ihany, andao andramana mampiasa socket UNIX fa tsy socket network. Satria ny fifandraisana dia mitaky socket na ahoana na ahoana, andao isika hiezaka hanao dingana iray hafa ary amboary ny fampahavitrihana socket ho an'ny Gunicorn amin'ny alΓ lan'ny systemd.

Ny dingan'ny famoronana socket activated services dia tsotra. Voalohany, misy rakitra iray noforonina izay misy torolalana ListenStream manondro ny toerana hamoronana ny socket UNIX, avy eo ny rakitra iray ho an'ny serivisy izay hanondro ny fisie socket ny torolΓ lana Requires. Avy eo, ao amin'ny rakitra unit serivisy, ny hany sisa tavela dia ny miantso an'i Gunicorn amin'ny tontolo virtoaly ary mamorona WSGI mifamatotra amin'ny socket UNIX sy ny fampiharana Django.

Ireto misy ohatra vitsivitsy amin'ny rakitra unit azonao ampiasaina ho fototra. Voalohany dia mametraka ny socket isika.

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Ankehitriny dia mila manamboatra ny daemon Gunicorn ianao.

[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

Ho an'i Nginx, raharaha tsotra ny famoronana rakitra fanamafisana proxy sy fametrahana lahatahiry hitahiry votoaty static raha mampiasa iray ianao. Ao amin'ny RHEL, ny rakitra fanamafisana Nginx dia hita ao amin'ny /etc/nginx/conf.d. Azonao atao ny mandika ity ohatra manaraka ity ao amin'ny rakitra /etc/nginx/conf.d/default.conf ary manomboka ny serivisy. Ataovy azo antoka ny mametraka ny server_name hifanaraka amin'ny anaran'ny mpampiantrano anao.

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

Atombohy ny socket Gunicorn sy Nginx mampiasa systemd ary vonona ny hanomboka fitsapana ianao.

Error Gateway ratsy?

Raha ampidirinao ao amin'ny navigateur ny adiresy dia mety hahazo fahadisoana 502 Bad Gateway ianao. Mety ho vokatry ny fahazoan-dΓ lana UNIX diso namboarina, na mety noho ny olana sarotra kokoa mifandraika amin'ny fanaraha-maso ny fidirana ao amin'ny SELinux.

Ao amin'ny log error nginx dia afaka mahita tsipika toy izao ianao:

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"

Raha mitsapa mivantana an'i Gunicorn isika dia hahazo valiny poakaty.

curl β€”unix-socket /run/gunicorn.sock 8beta1.example.com

Andeha hojerentsika ny antony mahatonga izany. Raha manokatra ny log ianao dia ho hitanao fa mifandray amin'ny SELinux ny olana. Koa satria mitantana daemon izay tsy misy politika noforonina, dia voamarika ho init_t. Andao hizaha toetra io teoria io amin'ny fampiharana.

sudo setenforce 0

Izany rehetra izany dia mety hiteraka fanakianana sy ranomason-drΓ , fa izany dia ny debugging ny prototype fotsiny. Andeha hofoanana ny fisavana mba hahazoana antoka fa io no olana, ary avy eo dia hamerina ny zava-drehetra amin'ny toerany.

Amin'ny alΓ lan'ny famelombelomana ny pejy ao amin'ny navigateur na ny famerenana ny baikon'ny curl dia azonao jerena ny pejin'ny fitsapana Django.

Noho izany, rehefa nahazo antoka fa mandeha ny zava-drehetra ary tsy misy olana amin'ny fahazoan-dΓ lana intsony, dia mamela ny SELinux indray izahay.

sudo setenforce 1

Tsy hiresaka momba ny audit2allow aho na hamorona politika mifototra amin'ny sepolgen eto, satria tsy misy fampiharana Django tena izy amin'izao fotoana izao, noho izany dia tsy misy sarintany feno momba izay mety ho tian'i Gunicorn hidirana sy izay tokony handΓ  ny fidirana. Noho izany, ilaina ny mitazona ny SELinux mihazakazaka mba hiarovana ny rafitra, ary mamela ny fampiharana handeha sy hamela hafatra ao amin'ny diarin'ny fanaraha-maso mba hahafahan'izy ireo mamorona ny politika marina avy eo.

Famaritana ny sehatra mamela

Tsy ny rehetra no nandre momba ny domains navela tao amin'ny SELinux, saingy tsy zava-baovao izy ireo. Maro aza no niara-niasa tamin’izy ireo nefa tsy tonga saina. Rehefa misy politika noforonina mifototra amin'ny hafatra fanamarinana, ny politika noforonina dia maneho ny sehatra voavaha. Andao hiezaka hamorona politika fanomezan-dΓ lana tsotra.

Mba hamoronana sehatra manokana azo alaina ho an'ny Gunicorn dia mila karazana politika ianao, ary mila manisy marika ireo rakitra mety. Ankoatra izany, ilaina ny fitaovana hanangonana politika vaovao.

sudo yum install selinux-policy-devel

Ny mekanika domains navela dia fitaovana tsara hamantarana ireo olana, indrindra rehefa mikasika ny fampiharana manokana na fampiharana izay alefa tsy misy politika efa noforonina. Amin'ity tranga ity, ny politikan'ny sehatra navela ho an'ny Gunicorn dia ho tsotra araka izay azo atao - manambara karazana lehibe (gunicorn_t), manambara karazana iray izay hampiasainay hanamarihana ireo executable marobe (gunicorn_exec_t), ary avy eo manangana tetezamita ho an'ny rafitra hanamarihana tsara. mihazakazaka dingana . Ny andalana farany dia mametraka ny politika ho alefa amin'ny alΓ lan'ny default amin'ny fotoana hampidirana azy.

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;

Azonao atao ny manangona ity rakitra politika ity ary manampy azy amin'ny rafitrao.

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

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

Andeha hojerentsika raha manakana zavatra hafa ankoatry ny daemon tsy fantatra idirana ny 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 dia manakana ny Nginx tsy hanoratra angona amin'ny socket UNIX ampiasain'i Gunicorn. Amin'ny ankapobeny, amin'ny tranga toy izany dia manomboka miova ny politika, saingy misy fanamby hafa ho avy. Azonao atao koa ny manova ny firafitry ny sehatra avy amin'ny sehatra famerana ho sehatra fahazoan-dΓ lana. Andao izao hamindra ny httpd_t mankany amin'ny sehatry ny fahazoan-dΓ lana. Izany dia hanome an'i Nginx ny fidirana ilaina ary afaka manohy ny asa debugging bebe kokoa isika.

sudo semanage permissive -a httpd_t

Noho izany, rehefa vitanao ny niaro ny SELinux (tena tsy tokony handao ny tetikasa SELinux amin'ny fomba voafetra ianao) ary fenoina ny sehatra fahazoan-dΓ lana dia mila fantarinao hoe inona marina no tokony homarihina ho gunicorn_exec_t mba hampandeha tsara ny zava-drehetra. indray. Andeha isika hitsidika ny tranokala hahitana hafatra vaovao momba ny famerana ny fidirana.

sudo ausearch -m AVC -c gunicorn

Hahita hafatra be dia be misy 'comm="gunicorn"' ianao izay manao zavatra isan-karazany amin'ny rakitra ao amin'ny /srv/djangoapp, ka mazava ho azy fa iray amin'ireo baiko mendrika hasiana marika izany.

Fa ho fanampin'izany dia misy hafatra toy izao:

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

Raha mijery ny toeran'ny serivisy gunicorn ianao na mampandeha ny baiko ps dia tsy hahita dingana mihazakazaka ianao. Toa manandrana miditra amin'ny mpandika teny Python ao amin'ny tontolo virtoaly virtoaly i gunicorn, mety hampandeha sora-tanana mpiasa. Andeha Γ ry asio marika ireo rakitra roa azo tanterahana ireo ary jereo raha afaka manokatra ny pejin'ny fitsapana Django isika.

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

Mila averina averina ny serivisy gunicorn alohan'ny hisafidianana ny marika vaovao. Azonao atao ny mamerina azy avy hatrany na manajanona ny serivisy ary avelao ny socket hanomboka izany rehefa manokatra ilay tranokala amin'ny navigateur ianao. Hamarino fa nahazo mari-pamantarana marina amin'ny fampiasana ps ny dingana.

ps -efZ | grep gunicorn

Aza adino ny mamorona politika SELinux mahazatra any aoriana!

Raha mijery ny hafatra AVC ianao izao, ny hafatra farany dia misy permissive=1 ho an'ny zavatra rehetra mifandraika amin'ny fampiharana, ary permissive=0 ho an'ny rafitra sisa. Raha azonao ny karazana fidirana ilain'ny fampiharana tena izy, dia afaka mahita haingana ny fomba tsara indrindra hamahana olana toy izany ianao. Saingy mandra-pahatongan'izany, tsara kokoa ny mitazona ny rafitra ho azo antoka ary mahazo fanaraha-maso mazava sy azo ampiasaina amin'ny tetikasa Django.

sudo ausearch -m AVC

Nitranga!

Tetik'asa Django miasa dia niseho miaraka amin'ny frontend mifototra amin'ny Nginx sy Gunicorn WSGI. Namboarinay Python 3 sy PostgreSQL 10 avy amin'ny tahiry RHEL 8 Beta. Ankehitriny ianao dia afaka mandroso sy mamorona (na mametraka fotsiny) Django rindranasa na mikaroka fitaovana hafa misy ao amin'ny RHEL 8 Beta mba hanamafisana ny fizotry ny fanamafisana, hanatsara ny fampisehoana, na hanamafisana an'io fanamafisana io mihitsy aza.

Source: www.habr.com

Add a comment