RHEL 8 Beta ืืฆืืข ืืืคืชืืื ืชืืื ืืช ืืืฉืืช ืจืืืช, ืฉืืจืฉืืื ืฉืืื ืขืฉืืื ืืงืืช ืืคืื, ืขื ืืืช, ืืืืื ืฉื ืืืจืื ืืืฉืื ืืื ืชืืื ืืืื ืืืชืจ ืืคืืขื, ืื ืืืื ืื ื ืืฆืืขืื ืกืื ื ืืืฆืืจืช ืชืฉืชืืช ืืคืืืงืฆืื ืืืืืกืกืช ืขื Red Hat Enterprise Linux 8 Beta.
ืืืื ื ืืงื ืืช Python, ืฉืคืช ืชืื ืืช ืคืืคืืืจืืช ืืงืจื ืืคืชืืื, ืืืกืืก, ืฉืืืื ืฉื Django ื-PostgreSQL, ืฉืืืื ื ืคืืฅ ืืืื ืืืฆืืจืช ืืคืืืงืฆืืืช, ืื ืงืืข ืืช RHEL 8 Beta ืืขืืื ืืืชื. ืืืืจ ืืื ื ืืกืืฃ ืขืื ืืื ืืจืืืืื (ืื ืืกืืืืื).
ืกืืืืช ืืืืืงื ืชืฉืชื ื, ืื ืืขื ืืื ืืืงืืจ ืืช ืืืคืฉืจืืืืช ืฉื ืืืืืืฆืื, ืขืืืื ืขื ืงืื ืืืื ืจืื ืื ืืกืืื ืฉื ืกืืืืืช ืขื ืืกืคืจ ืฉืจืชืื. ืืื ืืืชืืื ืขื ืคืจืืืงื ืืืฉ, ืืชื ืืืื ืืืชืืื ืืืฆืืจืช ืื ืืืคืืก ืงืื ืืคืฉืื ืืื ืืื ืฉืชืืื ืืจืืืช ืืืืืง ืื ืฆืจืื ืืงืจืืช ืืืื ืืื ืืงืืื ืืื ืืจืืงืฆืื, ืืืืืจ ืืื ืืขืืืจ ืืืืืืืฆืื ืืืืฆืืจ ืชืฆืืจืืช ืืืจืืืืช ืืืชืจ. ืืืื ืื ืื ื ืืืืจืื ืขื ืืฆืืจืช ืื ืืืคืืก ืืื.
ื ืชืืื ืืคืจืืกืช ืชืืื ืช RHEL 8 Beta VM. ืืชื ืืืื ืืืชืงืื ืืืื ื ืืืจืืืืืืช ืืืคืก, ืื ืืืฉืชืืฉ ืืชืืื ืช ืืืจื KVM ืืืืื ื ืขื ืื ืื ืืืืื ืฉืื. ืืขืช ืฉืืืืฉ ืืชืืื ืช ืืืจื, ืชืฆืืจื ืืืืืืจ ืชืงืืืืืจ ืืืจืืืืื ืฉืืืื ืืื ื ืชืื ืื ืื ืชืื ื ืืฉืชืืฉ ืืืชืืื ืขื ื (cloud-init). ืืชื ืื ืฆืจืื ืืขืฉืืช ืฉืื ืืืจ ืืืืื ืขื ืืื ื ืืืืกืง ืื ืืืืืืืช ืืืืื ืืช; ืื ืชืฆืืจื ืชืชืืื.
ืืืื ื ืกืชืื ืืงืจืื ืขื ืื ืืชืืืื.
ืืชืงื ืช ื'ื ืื
ืขื ืืืจืกื ืืืืฉื ืืืืชืจ ืฉื Django, ืชืืืงืง ืืกืืืื ืืืจืืืืืืช (virtualenv) ืขื Python 3.5 ืืืืื. ืืืขืจืืช ืืืื ืชืืืื ืืจืืืช ืฉ-Python 3.6 ืืืื, ืืืื ื ืืืืง ืื ืื ืืื ืืืงืจื:
[cloud-user@8beta1 ~]$ python
-bash: python: command not found
[cloud-user@8beta1 ~]$ python3
-bash: python3: command not found
Red Hat ืืฉืชืืฉ ืืืืคื ืคืขืื ื-Python ืืขืจืืช ืืืื ืืขืจืืชืืช ื-RHEL, ืื ืืื ืื ืชืืฆืื?
ืืขืืืื ืืื ืฉืืคืชืื Python ืจืืื ืขืืืื ืฉืืงืืื ืืช ืืืขืืจ ื-Python 2 ืืคืืืชืื 2, ืืขืื ืฉ-Python 3 ืขืฆืื ื ืืฆื ืืคืืชืื ืคืขืื, ืืขืื ืืขืื ืืจืกืืืช ืืืฉืืช ืืืคืืขืืช ืืื ืืจืฃ. ืืื, ืืื ืืขื ืืช ืขื ืืฆืืจื ืืืื ืืขืจืืช ืืฆืืืื ืชืื ืืชื ืืืฉื ืืืฉืชืืฉืื ืืืจืกืืืช ืืืฉืืช ืฉืื ืืช ืฉื Python, ืืขืจืืช Python ืืืขืืจื ืืืืืื ืืืฉื ืืกืืคืงื ืืช ืืืืืืช ืืืชืงืื ืื Python 2.7 ืืื 3.6. ืืืืข ื ืืกืฃ ืขื ืืฉืื ืืืื ืืืืืข ืืืฆืขื ื ืืชื ืืืฆืื ืืคืจืกืื ื
ืื ืืื ืืืชืืื ืืขืืื ื-Python, ืืชื ืจืง ืฆืจืื ืืืชืงืื ืฉืชื ืืืืืืช, ืขื python3-pip ืืืืื ืืชืืืช.
sudo yum install python36 python3-virtualenv
ืืื ืื ืืืฉืชืืฉ ืืงืจืืืืช ืืืืื ืืฉืืจืืช ืืคื ืฉืื ืืืื ืืฆืืข ืืืืชืงืื pip3? ืืืชืืฉื ืืืืืืืฆืื ืืงืจืืื, ืืืืข ืฉ-Ansible ืืืจืืฉ ืืชืงื ืช pip ืืื ืืคืขืื, ืืืืืื ืฉืืืืื ื-pip ืืื ื ืชืืื ื-virtualenvs ืขื ืงืืืฅ ืืคืขืื ืืืชืื ืืืฉืืช ืฉื pip.
ืขื ืืชืืจืืื python3 ืขืืื ืืจืฉืืชืื, ืชืืืื ืืืืฉืื ืืชืืืื ืืืชืงื ื ืฉื Django ืืืงืื ืืขืจืืช ืขืืืืช ืืื ืขื ืฉืืจ ืืจืืืืื ืฉืื ื. ืืฉื ื ืืคืฉืจืืืืช ืืืฉืื ืจืืืช ืืืืื ืืช ืืืื ืืจื ื. ืืฉ ืืื ืืจืกื ืืืช, ืื ืืฉืชืืฉืื ืืืืืื ืืืฉืชืืฉ ืืชืืืืืื ืืฉืืื.
ื ืชืงืื ืืช ืืจืกืืืช PostgreSQL ื-Nginx ืืืืื ืืช ื-RHEL 8 ืืืจืืจืช ืืืื ืืืืฆืขืืช Yum.
sudo yum install nginx postgresql-server
PostgreSQL ืืืจืืฉ psycopg2, ืืื ืืื ืฆืจืื ืืืืืช ืืืื ืจืง ืืกืืืืช Virtualenv, ืื ื ืชืงืื ืืืชื ืืืืฆืขืืช pip3 ืืื ืขื Django ื-Gunicorn. ืืื ืชืืืื ืขืืื ื ืืืืืืจ ืืช virtualenv.
ืชืืื ืืฉ ืืจืื ืืืืืืื ืื ืืฉื ืืืืจืช ืืืงืื ืื ืืื ืืืชืงื ืช ืคืจืืืงืื Django, ืื ืืืฉืจ ืืฉ ืกืคืง, ืืชื ืชืืื ืืืื ืืคื ืืช ืืชืงื ืืืืจืจืืื ืฉื ืืขืจืืช ืืงืืฆืื ืฉื ืืื ืืงืก. ืืืืคื ืกืคืฆืืคื, ื-FHS ืืืืจ ืฉ-/srv ืืฉืืฉ ื: "ืืืืกื ื ืชืื ืื ืกืคืฆืืคืืื ืืืืจื - ื ืชืื ืื ืฉืืืขืจืืช ืืืืฆืจืช, ืืืื ื ืชืื ืื ืืกืงืจืืคืืื ืฉื ืฉืจืช ืืื ืืจื ื, ื ืชืื ืื ืืืืืืกื ืื ืืฉืจืชื FTP ืืืงืจื ืขื ืืืืจื ืืขืจืืช." ืืจืกืืืช (ืืืคืืขืืช ื-FHS -2.3 ืืฉื ืช 2004)."
ืื ืืืืืง ืืืงืจื ืฉืื ื, ืื ืื ืื ื ืืื ืืกืื ืืช ืื ืื ืฉืื ืื ื ืฆืจืืืื ืืชืื /srv, ืฉืืื ืืืขืืืช ืืฉืชืืฉ ืืืคืืืงืฆืื ืฉืื ื (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
ืืืืจืช PostgreSQL ื-Django ืืื ืงืื: ืฆืืจ ืืกื ื ืชืื ืื, ืฆืืจ ืืฉืชืืฉ, ืืืืจ ืืจืฉืืืช. ืืืจ ืืื ืฉืืฉ ืืืืืจ ืืขืช ืืชืงื ืช PostgreSQL ืืจืืฉืื ื ืืื ืกืงืจืืคื postgresql-setup ืฉืืืชืงื ืขื ืืืืืช postgresql-server. ืกืงืจืืคื ืื ืขืืืจ ืื ืืืฆืข ืืฉืืืืช ืืกืืกืืืช ืืงืฉืืจืืช ืื ืืืื ืืฉืืื ืืกื ื ืชืื ืื, ืืืื ืืชืืื ืืฉืืื ืื ืชืืืื ืืฉืืจืื. ืืื ืืืืืืจ ืืืคืข PostgreSQL ืืืฉ ืืืขืจืืช RHEL, ืขืืื ื ืืืคืขืื ืืช ืืคืงืืื:
sudo /usr/bin/postgresql-setup -initdb
ืืืืจ ืืื ืชืืื ืืืคืขืื ืืช PostgreSQL ืืืืฆืขืืช systemd, ืืืฆืืจ ืืกื ื ืชืื ืื ืืืืืืืจ ืคืจืืืงื ื-Django. ืืืืจ ืืืคืขืื ืืืืฉ ืืช PostgreSQL ืืืืจ ืืืฆืืข ืฉืื ืืืื ืืงืืืฅ ืืชืฆืืจื ืฉื ืืืืืช ืืืงืื (ืืืจื ืืื pg_hba.conf) ืืื ืืืืืืจ ืืืกืื ืกืืกืืืืช ืขืืืจ ืืฉืชืืฉ ืืืคืืืงืฆืื. ืื ืืชื ื ืชืงื ืืงืฉืืื ืืืจืื, ืืงืคื ืืฉื ืืช ืืช ืืืืจืืช IPv4 ื-IPv6 ืืงืืืฅ 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
ืืงืืืฅ /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
ืืงืืืฅ /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 }}',
}
}
ืืืืจ ืืืืจืช ืงืืืฅ settings.py ืืคืจืืืงื ืืืืืจืช ืชืฆืืจืช ืืกื ืื ืชืื ืื, ืชืืื ืืืคืขืื ืืช ืฉืจืช ืืคืืชืื ืืื ืืืืื ืฉืืื ืขืืื. ืืืืจ ืืคืขืืช ืฉืจืช ืืคืืชืื, ืืืื ืืืฆืืจ ืืฉืชืืฉ ืืืืื ืขื ืื ืช ืืืืืง ืืช ืืืืืืจ ืืืกื ืื ืชืื ืื.
./manage.py runserver 0.0.0.0:8000
./manage.py createsuperuser
WSGI? ืืืื?
ืฉืจืช ืืคืืชืื ืฉืืืืฉื ืืืืืงื, ืื ืืื ืืืคืขืื ืืช ืืืืฉืื ืขืืื ืืืืืืจ ืืช ืืฉืจืช ืื-proxy ืืืชืืืืื ืขืืืจ ืืืฉืง ื-Web Server Gateway (WSGI). ืืฉื ื ืืกืคืจ ืฉืืืืืื ื ืคืืฆืื, ืืืฉื, Apache HTTPD ืขื uWSGI ืื Nginx ืขื Gunicorn.
ืชืคืงืืื ืฉื ืืืฉืง ืฉืขืจ ืืืื ืืจื ื ืฉื ืฉืจืช ืืืื ืืจื ื ืืื ืืืขืืืจ ืืงืฉืืช ืืฉืจืช ืืืื ืืจื ื ืืืกืืจืช ืืืื ืืจื ื ืฉื Python. WSGI ืืื ืฉืจืื ืืืขืืจ ืื ืืจื ืืฉืื ืืขื CGI ืืื ืืกืืืื, ืืืืื WSGI ืืื ืืชืงื ืื ืคืงืื, ืืื ืงืฉืจ ืืฉืจืช ืืืื ืืจื ื ืื ืืืกืืจืช ืฉื Python ืืฉืืืืฉ. ืื ืืืจืืช ืืฉืืืืฉ ืื ืจืื ืื, ืขืืืื ืืฉื ื ื ืืืื ืกืื ืจืืื ืืขืืืื ืขื ืืกืืจืืช ืืื, ืืืคืฉืจืืืืช ืจืืืช. ืืืงืจื ืื, ื ื ืกื ืืืฆืืจ ืืื ืืจืืงืฆืื ืืื Gunicorn ื-Nginx ืืืืฆืขืืช ืฉืงืข.
ืืืืืื ืฉืฉื ื ืืจืืืืื ืืืื ืืืชืงื ืื ืขื ืืืชื ืฉืจืช, ืืืื ื ื ืกื ืืืฉืชืืฉ ืืฉืงืข UNIX ืืืงืื ืืฉืงืข ืจืฉืช. ืืืืืื ืฉืชืงืฉืืจืช ืืฆืจืืื ืฉืงืข ืืื ืืงืจื, ืืืื ื ื ืกื ืืขืฉืืช ืขืื ืฆืขื ืืื ืืืืืืืจ ืืช ืืคืขืืช ืืฉืงืข ืขืืืจ Gunicorn ืืืืฆืขืืช systemd.
ืืชืืืื ืฉื ืืฆืืจืช ืฉืืจืืชืื ืืืคืขืืื ืืฉืงืข ืืื ืื ืคืฉืื. ืจืืฉืืช, ื ืืฆืจ ืงืืืฅ ืืืืื ืืืืื ืื ืืืืช ListenStream ืืืฆืืืขื ืขื ืื ืงืืื ืื ืืืืืฆืจ ืฉืงืข ื-UNIX, ืืืืจ ืืื ืงืืืฅ ืืืืื ืขืืืจ ืืฉืืจืืช ืฉืื ืืื ืืื Requires ืชืฆืืืข ืขื ืงืืืฅ ืืืืืช ืืฉืงืข. ืืืืจ ืืื, ืืงืืืฅ ืืืืืช ืืฉืืจืืช, ืื ืฉื ืืชืจ ืืื ืืืชืงืฉืจ ื-Gunicorn ืืืกืืืื ืืืืืจืืืืืืช ืืืืฆืืจ ืืจืืืช WSGI ืขืืืจ ืฉืงืข UNIX ืืืคืืืงืฆืืืช Django.
ืืืื ืืื ืืืืืืืช ืืงืืฆื ืืืืื ืฉืชืืื ืืืฉืชืืฉ ืืื ืืืกืืก. ืจืืฉืืช ืืืืจื ื ืืช ืืฉืงืข.
[Unit]
Description=Gunicorn WSGI socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
ืขืืฉืื ืืชื ืฆืจืื ืืืืืืจ ืืช ืืืืื 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
ืขืืืจ Nginx, ืื ืขื ืืื ืคืฉืื ืฉื ืืฆืืจืช ืงืืฆื ืชืฆืืจืช proxy ืืืืืจืช ืกืคืจืืื ืืืืกืื ืชืืื ืกืืื ืื ืืชื ืืฉืชืืฉ ืืืื. ื-RHEL, ืงืืืฆื ืืชืฆืืจื ืฉื Nginx ื ืืฆืืื ื- /etc/nginx/conf.d. ืืชื ืืืื ืืืขืชืืง ืืช ืืืืืื ืืืื ืืงืืืฅ /etc/nginx/conf.d/default.conf ืืืืคืขืื ืืช ืืฉืืจืืช. ืืงืคื ืืืืืืจ ืืช server_name ืื ืฉืืชืืื ืืฉื ืืืืจื ืฉืื.
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;
}
}
ืืคืขื ืืช ืฉืงืข Gunicorn ืืืช Nginx ืืืืฆืขืืช systemd ืืืชื ืืืื ืืืชืืื ืืืืืงื.
ืฉืืืืช ืฉืขืจ ืืจืืข?
ืื ืชืืื ืืช ืืืชืืืช ืืืคืืคื ืฉืื, ืกืืืจ ืืื ืื ืฉืชืงืื ืฉืืืืช 502 Bad Gateway. ืื ืขืฉืื ืืืืืจื ืืืจืฉืืืช ืฉืงืข UNIX ืฉืืืืืจื ืืฆืืจื ืฉืืืื, ืื ืฉืื ืขืฉืื ืื ืืืข ืืืขืืืช ืืืจืืืืช ืืืชืจ ืืงืฉืืจืืช ืืืงืจืช ืืืฉื ื-SELinux.
ืืืืื ืืฉืืืืืช ืฉื nginx ืืชื ืืืื ืืจืืืช ืฉืืจื ืืื:
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"
ืื ื ืืืืง ืืช Gunicorn ืืฉืืจืืช, ื ืงืื ืชืฉืืื ืจืืงื.
curl โunix-socket /run/gunicorn.sock 8beta1.example.com
ืืืื ื ืืื ืืื ืื ืงืืจื. ืื ืชืคืชื ืืช ืืืืื, ืกืืืจ ืืื ืื ืฉืชืจืื ืฉืืืขืื ืงืฉืืจื ื-SELinux. ืืืืืื ืฉืื ื ืืคืขืืืื ืืืื ืฉืื ื ืืฆืจื ืขืืืจื ืืืื ืืืช, ืืื ืืกืืื ื-init_t. ืืืื ื ืืืืง ืืช ืืชืืืืจืื ืืื ืืคืืขื.
sudo setenforce 0
ืื ืื ืขืืื ืืืจืื ืืืืงืืจืช ืืืืขืืช ืฉื ืื, ืืื ืื ืจืง ื ืืคืื ืืืืืคืืก. ืืื ื ื ืืจื ืืช ืืฆ'ืง ืจืง ืืื ืืืืื ืฉืื ืืืขืื ืืืืืจ ืืื ื ืืืืจ ืืื ืืืงืืื.
ืขื ืืื ืจืขื ืื ืืืฃ ืืืคืืคื ืื ืืคืขืื ืืืืจืช ืฉื ืคืงืืืช ืืกืืกืื ืฉืื ื, ืชืืื ืืจืืืช ืืช ืืฃ ืืืืืงื ืฉื Django.
ืื, ืืืืจ ืฉืืืืืืชื ืฉืืื ืขืืื ืืฉืืื ืขืื ืืขืืืช ืืจืฉืื, ืื ื ืืคืขืืืื ืืช SELinux ืฉืื.
sudo setenforce 1
ืืื ืืื ืืืืืจ ืขื audit2allow ืื ืขื ืืฆืืจืช ืืืื ืืืช ืืืืกืกืช ืืชืจืืืช ืขื sepolgen, ืืืืืื ืฉืืจืืข ืืื ืืคืืืงืฆืืืช Django ืืืืชืืช, ืื ืฉืืื ืืคื ืฉืืื ืฉื ืื ืฉ-Gunicorn ืขืฉืื ืืจืฆืืช ืืืฉืช ืืืื ืขืืื ืืื ืืข ืืืฉื. ืืื, ืืฉ ืฆืืจื ืืืฉืืืจ ืืช SELinux ืคืืขื ืืื ืืืื ืขื ืืืขืจืืช, ืืื ืืืื ืืืคืฉืจ ืืืคืืืงืฆืื ืืคืขืื ืืืืฉืืืจ ืืืืขืืช ืืืืื ืืืืงืืจืช, ืื ืฉื ืืชื ืืืื ืืืฆืืจ ืืื ืืช ืืืืื ืืืช ืืคืืขื.
ืฆืืื ืชืืืืื ืืชืืจืื
ืื ืืืื ืฉืืขื ืขื ืืืืืื ืื ืืืชืจืื ื-SELinux, ืืื ืื ืื ืืืฉืื. ืจืืื ืืคืืื ืขืืื ืืืชื ืืืื ืืืืื ืืืช. ืืืฉืจ ืืืื ืืืช ื ืืฆืจืช ืขื ืกืื ืืืืขืืช ืืืงืืจืช, ืืืืื ืืืช ืฉื ืืฆืจื ืืืืฆืืช ืืช ืืชืืื ืฉื ืคืชืจ. ืืืื ื ื ืกื ืืืฆืืจ ืืืื ืืืช ืืืฉืืจ ืคืฉืืื.
ืืื ืืืฆืืจ ืืืืืื ืืืชืจ ืกืคืฆืืคื ืขืืืจ Gunicorn, ืืชื ืฆืจืื ืกืื ืฉื ืืืื ืืืช, ืืืชื ืฆืจืื ืื ืืกืื ืืช ืืงืืฆืื ืืืชืืืืื. ืื ืืกืฃ, ืืจืืฉืื ืืืื ืืืจืืืช ืคืืืืกืืช ืืืฉืืช.
sudo yum install selinux-policy-devel
ืื ืื ืื ืืชืืืืื ืืืืชืจืื ืืื ืืื ืืฆืืื ืืืืืื ืืขืืืช, ืืืืืื ืืฉืืืืืจ ืืืคืืืงืฆืื ืืืชืืืช ืืืฉืืช ืื ืืืฉืืืื ืื ืฉืืืื ืืื ืืืื ืืืช ืฉืืืจ ื ืืฆืจื. ืืืงืจื ืื, ืืืื ืืืช ืืืืืืื ืืืืชืจืช ืขืืืจ Gunicorn ืชืืื ืคืฉืืื ืืื ืืืคืฉืจ - ืืืจืื ืขื ืกืื ืจืืฉื (gunicorn_t), ืืืจืื ืขื ืกืื ืฉืื ื ืฉืชืืฉ ืืื ืืกืื ืืกืคืจ ืงืืืฆื ืืคืขืื (gunicorn_exec_t), ืืืืืจ ืืื ืืืืจ ืืขืืจ ืืืขืจืืช ืืกืืืื ื ืืื ืจืืฆื ืชืืืืืื. ืืฉืืจื ืืืืจืื ื ืืืืืจื ืืช ืืืืื ืืืช ืืืืคืขืืช ืืืจืืจืช ืืืื ืืืื ืืขืื ืชื.
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;
ืืชื ืืืื ืืืจืืื ืงืืืฅ ืืืื ืืืช ืื ืืืืืกืืฃ ืืืชื ืืืขืจืืช ืฉืื.
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
ืืชื ืชืจืื ืืจืื ืืืืขืืช ืืืืืืืช 'comm="gunicorn"' ืฉืขืืฉืืช ืืืจืื ืฉืื ืื ืืงืืฆืื ื-/srv/djangoapp, ืื ืืจืืจ ืฉืื ืืืช ืืคืงืืืืช ืฉืฉืืื ืืกืื.
ืืื ืื ืืกืฃ, ืืืคืืขื ืืืืขื ืืื:
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
ืื ืชืกืชืื ืขื ืืกืืืืก ืฉื ืฉืืจืืช ืืืื ืืงืืจื ืื ืชืคืขืื ืืช ืืคืงืืื ps, ืื ืชืจืื ืชืืืืืื ืคืืขืืื. ื ืจืื ืฉ-gunicorn ืื ืกื ืืืฉืช ืืืชืืจืืื Python ืืกืืืืช ืืืืืจืืืืื ืฉืื ื, ืืืื ืืื ืืืจืืฅ ืกืงืจืืคืืื ืฉื ืขืืืืื. ืื ืขืืฉืื ืืืื ื ืกืื ืืช ืฉื ื ืงืืฆื ืืืคืขืื ืืืื ืื ืืืืง ืื ื ืืื ืืคืชืื ืืช ืืฃ ืืืืืงื ืฉืื ื ื-Django.
chcon -t gunicorn_exec_t /srv/djangoapp/django/bin/gunicorn /srv/djangoapp/django/bin/python3.6
ืืืื ืฆืืจื ืืืคืขืื ืืืืฉ ืืช ืฉืืจืืช ืืืื ืืงืืจื ืืคื ื ืฉื ืืชื ืืืื ืืืืืจ ืืชื ืืืืฉ. ืืชื ืืืื ืืืคืขืื ืืืชื ืืืืฉ ืืื ืื ืืืคืกืืง ืืช ืืฉืืจืืช ืืืชืช ืืฉืงืข ืืืคืขืื ืืืชื ืืืฉืจ ืืชื ืคืืชื ืืช ืืืชืจ ืืืคืืคื. ืืื ืฉืชืืืืืื ืงืืืื ืืช ืืชืืืืืช ืื ืืื ืืช ืืืืฆืขืืช ps.
ps -efZ | grep gunicorn
ืื ืชืฉืื ืืืฆืืจ ืืืื ืืืช SELinux ืจืืืื ืืืืืจ ืืืชืจ!
ืื ืชืกืชืื ืขืืฉืื ืขื ืืืืขืืช AVC, ืืืืืขื ืืืืจืื ื ืืืืื permissive=1 ืืื ืื ืฉืงืฉืืจ ืืืคืืืงืฆืื, ืืืชืืจ=0 ืขืืืจ ืฉืืจ ืืืขืจืืช. ืื ืืชื ืืืื ืืืื ืกืื ืฉื ืืืฉื ืฆืจืื ืืืฉืื ืืืืชื, ืืชื ืืืื ืืืฆืื ืืืืืจืืช ืืช ืืืจื ืืืืื ืืืืชืจ ืืคืชืืจ ืืขืืืช ืืืื. ืืื ืขื ืื, ืขืืืฃ ืืฉืืืจ ืขื ืืืืืช ืืืขืจืืช ืืืงืื ืืืงืืจืช ืืจืืจื ืืฉืืืฉื ืฉื ืคืจืืืงื Django.
sudo ausearch -m AVC
ืงืจื!
ืคืจืืืงื Django ืขืืื ืืืคืืข ืขื ืืืืช ืืืืืกืกืช ืขื Nginx ื-Gunicorn WSGI. ืืืืจื ื ืืช Python 3 ื- PostgreSQL 10 ืืืืืจื RHEL 8 Beta. ืืขืช ืืชื ืืืื ืืืชืงืื ืืืืฆืืจ (ืื ืคืฉืื ืืคืจืืก) ืืืฉืืื Django ืื ืืืงืืจ ืืืื ืืืื ืื ืืืจืื ื-RHEL 8 Beta ืืื ืืืคืื ืืช ืชืืืื ืืชืฆืืจื ืืืืืืืื, ืืฉืคืจ ืืช ืืืืฆืืขืื, ืื ืืคืืื ืืืื ืืช ืืชืฆืืจื ืืื.
ืืงืืจ: www.habr.com