์ธํ๋ผ๋ฅผ ๊ฐ์ ํ๋ ๊ณผ์ ์์ ์ ๋ ๋ถํ์ํ ์ ์ค์ฒ ์์ด ๋๋ฃ(๊ฐ๋ฐ์, ํ ์คํฐ, ๊ด๋ฆฌ์ ๋ฑ)๊ฐ ovirt์์ ๊ฐ์ ๋จธ์ ์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํ๋ ์ค๋๋๊ณ ๊ณ ํต์ค๋ฌ์ด ์ง๋ฌธ์ ๋ง๋ฌด๋ฆฌํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. Ovirt์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ตฌ์ฑํด์ผ ํ๋ ์ฌ๋ฌ ๊ตฌ์ฑ ์์(์น ์ธํฐํ์ด์ค ์์ฒด, noVNC ์ฝ์, ๋์คํฌ ์ด๋ฏธ์ง ์ ๋ก๋)๊ฐ ์์ต๋๋ค.
"Make It Bad" ๋ฒํผ์ ์ฐพ์ ์ ์์ด์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ์์ก์ด๋ฅผ ์ฌ์ฉํ๋์ง ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ปท ์๋์ ์ ์ฒด ์ง์นจ:

๋ฉด์ฑ ์กฐํญ :
์์ํ๊ธฐ ์ ์, ์ ๊ฐ ์์ง ๋ชปํ๋ ์ด๋ค ์ด์ ๋ก ์ธํ๋ผ ๋๋ฉ์ธ์ด LAN, ๋ก์ปฌ ๋ฑ์ ๊ฐ์ธ ์์ญ์ ์์ฑ๋๋ค๋ ์ฌ์ค์ ์ฃผ๋ชฉํ๊ณ ์ถ์ต๋๋ค.
๊ณต๊ฐ ์์ญ์์ ์กฐ์ง์ ๋๋ฉ์ธ์ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ฅผ ๋ค์ด Alex-GLuck-Awesome-Company.local ๋๋ฉ์ธ ๋์ ํ์ฌ ์น์ฌ์ดํธ Alex-GLuck-Awesome-Company.com์ ๋๋ฉ์ธ์ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์กฐ์ง์ ๋๋ฉ์ธ์ ์ถ์ ํ ์ ์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊น ๋ด ๊ฑฑ์ ๋๋ค๋ฉด ์ฐ๊ฐ 100๋ฃจ๋ธ์ ๋น์ฉ์ผ๋ก aglac.com ์ธํ๋ผ๋ฅผ ์ํ ๋ณ๋์ ๋๋ฉ์ธ์ ๊ตฌ์ ํ ์ ์์ต๋๋ค.
๊ณต๊ฐ ์์ญ์์ ๋๋ฉ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ต์ฑ์ด ๋์ ์ด์ ๋ ๋ฌด์์ ๋๊น?
1. ๊ท ๊ธฐ๊ด์ ๊ณต๊ฐ์ ์ผ๋ก ์ด์ฉ ๊ฐ๋ฅํ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. VPNํ์ผ ๊ณต์ ์๋น์ค(Seafile, Nextcloud ๋ฑ)๋ฅผ ๋น๋กฏํ ์ฌ๋ฌ ์๋น์ค๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ์๋น์ค์์ ํธ๋ํฝ ์ํธํ๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋๊ฐ ํ์ ํ๊ฒ ์ด๋ฃจ์ด์ง๋ฉฐ, ์ค๊ฐ์ ๊ณต๊ฒฉ(MitM) ๋ฐฉ์ด๋ ์ด๋ ต๋ค๋ ์ด์ ๋ก (์ฌ์ค์ ์ด๋ ต์ง ์์ง๋ง) ๋ค๋ฃจ์ง ์์ ๊ฒ์ ๋๋ค.
๋๋ ์ฌ๋ฌด์ค ๋ด๋ถ์ ํ๋์ ์๋น์ค ์ฃผ์๊ฐ ์๊ณ ์ธํฐ๋ท์ ๋ค๋ฅธ ํ๋์ ์๋น์ค ์ฃผ์๊ฐ ์๋๋ฐ ์ด๋ฌํ ์ฐ๊ฒฐ์ ์ ์งํด์ผ ํ๋ฏ๋ก ์ ํ๋ ์ ๋ฌธ ์์์ด ๋ญ๋น๋ฉ๋๋ค. ๊ธ์, ์ง์๋ค์ ์๋ก ๋ค๋ฅธ ์ฃผ์๋ฅผ ๊ธฐ์ตํด์ผ ํ๋๋ฐ, ์ด๋ ๋ถํธํฉ๋๋ค.
2. ๋ฌด๋ฃ ์ธ์ฆ ๊ธฐ๊ด์ ์ฌ์ฉํ์ฌ ๋ด๋ถ ์๋น์ค๋ฅผ ์ํธํํ ์ ์์ต๋๋ค.
๊ทํ์ PKI๋ ๋ฌด๋ฃ ์ธ์ฆ ๊ธฐ๊ด์ PKI๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ธฐํ๋ฅผ ์ํด ์ฐ๊ฐ 100๋ฃจ๋ธ์ ์ง์ํด์ผ ํ๋ ์๋น์ค์ ๋๋ค.
3. ์์ฒด ์ธ์ฆ ๊ธฐ๊ด์ ์ฌ์ฉํ๋ฉด BYOD๋ก ์์ ํ๋ ค๋ ์๊ฒฉ ์ง์๊ณผ ๋๋ฃ(์์ ์ ๋ ธํธ๋ถ, ํด๋ํฐ, ํ๋ธ๋ฆฟ์ ๊ฐ์ ธ์ด)์๊ฒ ์ง์๋ฅผ ๋ด๋ฆฌ๊ฒ ๋๋ฉฐ ํด๋น ์ฅ์น๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๊ทธ๋ค์ Mac, Linux, Android, iOS, Windows๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ๊ทธ๋ฌํ ๋๋ฌผ์์ ์ง์ํ ํ์๊ฐ ์์ต๋๋ค.
๋ฌผ๋ก ๋ชจ๋ ๊ฒ์๋ ์์ธ๊ฐ ์์ผ๋ฉฐ, ๋ณด์ ์ ์ฑ ์ ์๋ฆฝํ ๋ค๋ฅธ ๊ฐํนํ ๊ธฐ์ ์ด ์๋ ์ํ์ ๊ฒฐ์ฝ ์ง์ ์๋น์ค๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ด๋ค์ ์ํด ์ผ์ ๊ธ์ก์ผ๋ก CA ์ธ์ฆ์์ ์๋ช ํ ์ ์๋ ์ ๋ฃ ์ธ์ฆ ๊ธฐ๊ด(Google โ๋ฃจํธ ์๋ช ์๋น์คโ)์ด ์์ต๋๋ค.
๊ณต๊ฐ ๋๋ฉ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ต์ฑ์ด ๋์ ๋ค๋ฅธ ์ด์ ๊ฐ ์์ง๋ง(๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๊ทธ๊ฒ์ด ๊ทํ์ ์์ ๋ผ๋ ๊ฒ์ ๋๋ค), ์ด ๊ธฐ์ฌ๋ ์ด์ ๊ดํ ๊ฒ์ด ์๋๋๋ค.
์์ ์ ...
์ฃผ๋ชฉ! Let's Encrypt CA ์ธ์ฆ์๋ฅผ ovirt์ ์ ๋ขฐํ ์ ์๋ ๋ชฉ๋ก์ ์ถ๊ฐํ๋ฉด ์์คํ ๋ณด์์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค!
๊ฐ์ฅ ๋จผ์ ์ฃผ์ํด์ผ ํ ์ ์ Ovirt ์ธํฐํ์ด์ค๋ฅผ ์ธํฐ๋ท์ ๋ ธ์ถํ๋ ๊ฒ์ ๋์ ์ต๊ด์ด๋ผ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ค์ง์ ์ธ ์๋ฏธ๊ฐ ์์ผ๋ฉฐ ์ถ๊ฐ์ ์ธ ๋ณด์ ์ํ์ ์ผ๊ธฐํฉ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ์ ๋ฐฐ์ค์ฒ ํธ์คํธ ์ค ํ๋์์ ์ธ์ฆ์๋ฅผ ์ป์ ๋ค์ ovirt-engine์ ์ฌ์ฉํ์ฌ ์ธ์ฆ์์ ํค๋ฅผ ํธ์คํธ๋ก ์ ์กํด์ผ ํฉ๋๋ค.
ovirt ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์์ ํธ์คํธ์ ์ธ๋ถ ์ฃผ์๋ฅผ DNS์ ์ถ๊ฐํฉ๋๋ค. ovirtengine.example.com, certbot ๋ฐ nginx ์ค์น๋ ๋ค์์ ๋จ๊ฒจ๋๊ฒ ์ต๋๋ค(์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ด๋ฏธ Habrรฉ์ ์ค๋ช ๋์ด ์์ต๋๋ค).
njinx ๋ฒ์ ์ค์ >=1.15.7
/etc/nginx/conf.d/default.conf
server {
server_name _;
listen 80 default_server;
location /robots.txt { alias /usr/share/nginx/html/robots.txt; }
location /.well-known {
root /usr/share/nginx/html;
}
location / {
return 444;
}
}
server {
server_name _;
listen 443 ssl http2 default_server;
location /robots.txt { alias /usr/share/nginx/html/robots.txt; }
location /.well-known {
root /usr/share/nginx/html;
}
ssl_certificate /etc/nginx/ssl/$ssl_server_name/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/$ssl_server_name/privkey.pem;
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
# ะฟะพะทะฒะพะปัะตะผ ัะตัะฒะตัั ะฟัะธะบัะตะฟะปััั OCSP-ะพัะฒะตัั, ัะตะผ ัะฐะผัะผ ัะผะตะฝััะฐั ะฒัะตะผั ะทะฐะณััะทะบะธ ัััะฐะฝะธั ั ะฟะพะปัะทะพะฒะฐัะตะปะตะน
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
location / {
return 444;
}
}
๊ทธ๋ฐ ๋ค์ ์ธ์ฆ์์ ํค๋ฅผ ์ป์ต๋๋ค.
certbot certonly --nginx -d ovirtengine.example.com
์ธ์ฆ์์ ํค๋ฅผ ๋ณด๊ดํ์ธ์.
tar Phczf /tmp/ovirtengine.example.com.tgz /etc/letsencrypt/live/ovirtengine.example.com
๋ฐฐ์ค์ฒ ํธ์คํธ์์ ์์นด์ด๋ธ๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ovirt ์์ง์ ์ ๋ก๋ํฉ๋๋ค:
scp bastion-host:/tmp/ovirtengine.example.com.tgz /tmp/
scp /tmp/ovirtengine.example.com.tgz ovirtengine.example.com:/
๋ชฉํ๋ฅผ ํฅํด ๋์๊ฐ์
๋ค์์ผ๋ก, ํ์ผ ์์น ์์คํ ์ ๋ํ ์ดํด๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ์์นด์ด๋ธ์ ์์ถ์ ํ๊ณ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ง๋ญ๋๋ค.
tar Pxzf /ovirtengine.example.com.tgz && rm -f ovirtengine.example.com.tgz
mkdir -p /etc/letsencrypt/live
ln -f -s /etc/letsencrypt/live /etc/pki/letsencrypt
Java ์ธ์ฆ์ ์ ์ฅ์(openjdk)๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ์๋ฅผ ํ์ธํ๋๋ก Ovirt์ ๋ด์ฅ๋ pki๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
cat << EOF > /etc/ovirt-engine/engine.conf.d/99-setup-pki.conf
ENGINE_HTTPS_PKI_TRUST_STORE="/etc/pki/java/cacerts"
ENGINE_HTTPS_PKI_TRUST_STORE_PASSWORD=""
EOF
CA๋ฅผ Let's encrypt์์ der ํ์์ผ๋ก ๋ณํํ๊ณ ์ด๋ฅผ ovirt Java ์ ๋ขฐ ์ ์ฅ์ ์ธ์ฆ์ ์ ์ฅ์์ ์ถ๊ฐํฉ๋๋ค(์ด๊ฒ์ ์ธ์ฆ์ ๋ชฉ๋ก์ด ํฌํจ๋ ์ปจํ ์ด๋์ด๋ฉฐ Java์์ ์ฌ์ฉ๋๋ ์์คํ ์ ๋๋ค).
openssl x509 -outform der -in /etc/pki/letsencrypt/ovirtengine.example.com/chain.pem -out /tmp/ovirtengine.example.com.chain.der
keytool -import -alias "Let's Encrypt Authority X3" -file /tmp/ovirtengine.example.com.chain.der -keystore /etc/pki/ovirt-engine/.truststore -storepass $(grep '^ENGINE_PKI_TRUST_STORE_PASSWORD' /etc/ovirt-engine/engine.conf.d/10-setup-pki.conf | cut -f 2 -d '"')
rm -f /tmp/ovirtengine.example.com.chain.der
Apache์ ๋ํ SSL ์ค์ ์ ํธ์งํ๊ณ , ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ง์ํ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๊ณ , ์ธ์ฆ์๋ฅผ ํ์ธํ CA์ ๋ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ฑฐํฉ๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ขฐํ ์ ์๋ CA์ ์์คํ ์ธํธ๊ฐ ํ์ธ์ ์ฌ์ฉ๋ฉ๋๋ค).
sed -r -i 's|^(SSLCACertificateFile.*)|#1|g' /etc/httpd/conf.d/ssl.conf
sed -r -i '0,/(^#?SSLCACertificateFile.*)/ s//1nOptions FollowSymlinks/' /etc/httpd/conf.d/ssl.conf
๊ทธ๋ฐ ๋ค์ ๋ง์ผ์ ๋๋นํด ovirt์ ์๋ PKI๋ฅผ ํตํด ์์ฑ๋ ์๋ณธ ํ์ผ์ ๋ฐฑ์ ํ๊ณ ์ด๋ฅผ Letโs Encrypt์ ํ์ผ์ด ํฌํจ๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ก ๋์ฒดํฉ๋๋ค.
ln -f -s /etc/pki/letsencrypt/ovirtengine.example.com/fullchain.pem /etc/pki/ovirt-engine/apache-chain.pem
services=( 'apache' 'imageio-proxy' 'websocket-proxy' )
for i in "${services[@]}"; do
cp /etc/pki/ovirt-engine/certs/$i.cer{,."$( date +%F )".bak}
cp /etc/pki/ovirt-engine/keys/$i.key.nopass{,."$( date +%F )".bak}
ln -f -s /etc/pki/letsencrypt/ovirtengine.example.com/privkey.pem /etc/pki/ovirt-engine/keys/$i.key.nopass
ln -f -s /etc/pki/letsencrypt/ovirtengine.example.com/cert.pem /etc/pki/ovirt-engine/certs/{apache,imageio-proxy,websocket-proxy}.cer
done
ํ์ผ์์ SElinux ์ปจํ ์คํธ๋ฅผ ๋ณต์ํ๊ณ ์๋น์ค(httpd, ovirt-engine, ovirt-imageio-proxy, ovirt-websocket-proxy)๋ฅผ ๋ค์ ์์ํฉ๋๋ค.
restorecon -Rv /etc/pki
systemctl restart httpd ovirt-engine ovirt-imageio-proxy ovirt-websocket-proxy
httpd โ ์น ์๋ฒ ์ํ์น
ovirt-engine - ovirt ์น ์ธํฐํ์ด์ค
ovirt-imageio-proxy - ๋์คํฌ ์ด๋ฏธ์ง ๋ค์ด๋ก๋์ฉ ๋ฐ๋ชฌ
ovirt-websocket-proxy - noVNC ์ฝ์ ์คํ์ ์ํ ์๋น์ค
์์ ๋ชจ๋ ๋ด์ฉ์ Ovirt ๋ฒ์ 4.2์์ ํ ์คํธ๋์์ต๋๋ค.
ovirt์์ ์ธ์ฆ์ ์๋ ๊ฐฑ์
์ฌ๋ฐ๋ฅธ ๋ณด์ ๊ดํ์ ๋ฐ๋ฅด๋ฉด ๋ฐฐ์ค์ฒ ํธ์คํธ์ ovirt ์ฌ์ด์๋ ์ฐ๊ฒฐ์ด ์์ด์ผ ํ๋ฉฐ ์ธ์ฆ์๋ 3๊ฐ์ ๋์๋ง ๋ฐ๊ธ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์ธ์ฆ์ ๊ฐฑ์ ์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง์ ๋ํ ๋ ผ๋์ ์ฌ์ง๊ฐ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋๋ ์ผ์ ์ ๋ฐ๋ผ ๋งค์ผ ์ค์ 5์์ ํฌ๋จผ์์ ์คํ๋๋ Ansible ํ๋ ์ด๋ถ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด ํ๋ ์ด๋ถ์ ovirt๋ก ๊ฐ์ ์ธ์ฆ์์ ์ ํจ ๊ธฐ๊ฐ์ ํ์ธํ๊ณ ๋ง๋ฃ๊น์ง 5์ผ ๋ฏธ๋ง ๋จ์์ ๊ฒฝ์ฐ ๋ฐฐ์ค์ฒ ํธ์คํธ๋ก ๊ฐ์ ์ธ์ฆ์ ์ ๋ฐ์ดํธ๋ฅผ ์์ํฉ๋๋ค.
์ธ์ฆ์๋ฅผ ์ ๋ฐ์ดํธํ ํ ํด๋น ํด๋๋ฅผ ํ์ผ๊ณผ ํจ๊ป ๋ณด๊ดํ๊ณ Forman ํธ์คํธ์ ๋ค์ด๋ก๋ํ ํ Ovirt ํธ์คํธ์ ์์ถ์ ํ๋๋ค. ๊ทธ๋ฐ ๋ค์ SElinux๋ ํ์ผ์ ์ปจํ ์คํธ๋ฅผ ๋ณต์ํ๊ณ ์๋น์ค๋ฅผ ๋ค์ ์์ํฉ๋๋ค.
์ถ์ฒ : habr.com
