Manage multiple server & client computers with SaltStack (finnish)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1052 lines
33 KiB

6 years ago
  1. Palvelinten hallinta - Harjoitus 2
  2. ==============
  3. *Disclaimer:*
  4. --------------
  5. Tämä harjoitus on tehty osana Haaga-Helian Tietojenkäsittelyn koulutusohjelman kurssia [Palvelinten hallinta (ICT4TN022, kevät 2018)](http://www.haaga-helia.fi/fi/opinto-opas/opintojaksokuvaukset/ICT4TN022). Kurssin pitäjänä toimii [Tero Karvinen](http://terokarvinen.com/), joka on määritellyt tämän harjoituksen tehtävänkuvaukset. Tehtävien vastaukset ovat Pekka Heleniuksen (allekirjoittanut) tuottamia.
  6. b) Laita käyttäjien kotisivut toimimaan Apachella - Salt
  7. --------------
  8. **Vastaus:**
  9. Olemme tässä vaiheessa luoneet perusedellytykset Masterille ja Minione(ille). Ks. [harjoitus 1](https://github.com/Fincer-altego/central-management-of-multiple-servers/blob/master/h1.md)
  10. Luodaan Master-koneen kansioon _/srv/salt_ state-tiedosto *0_create_indexhtml.sls* komennolla *sudo nano /srv/salt/0_create_indexhtml.sls* ja täydennetään se sisällöllä:
  11. ```
  12. # This is a Salt script for installing Apache HTTP daemon with
  13. # default userdir configuration to minion computers
  14. # Author: Pekka Helenius (~Fincer), 2018
  15. #########################################
  16. # Install Apache HTTP daemon to minions
  17. install_httpd_daemon:
  18. pkg.installed:
  19. - pkgs:
  20. - apache2
  21. #########################################
  22. # Enable Apache userdir module
  23. httpd_userdir:
  24. cmd.run:
  25. - name: /usr/sbin/a2enmod userdir
  26. - require:
  27. - pkg: install_httpd_daemon
  28. #########################################
  29. # Replace default index.html content
  30. httpd_foo-index:
  31. cmd.run:
  32. - name: /bin/echo "foo" > /var/www/html/index.html
  33. - require:
  34. - cmd: httpd_userdir
  35. - pkg: install_httpd_daemon
  36. #########################################
  37. # Execute public_html script
  38. execute_public_html:
  39. cmd.script:
  40. - name: salt://0_create_indexhtml.sh
  41. - runas: root
  42. #########################################
  43. # Restart Apache HTTP daemon
  44. httpd_service_restart_userdir:
  45. service.running:
  46. - name: apache2.service
  47. - watch:
  48. - cmd: httpd_userdir
  49. ```
  50. Tiedoston oikeudet tulisi olla: u=rw, g=r, o=r (0644)
  51. Harjoituksessa käytetään Debian-pohjaisia Xubuntu-käyttöjärjestelmiä (18.04 LTS).
  52. Varmistetaan, että "orja" -alkuisiin orjakoneisiin (minions) saadaan yhteys suorittamalla master-koneella esim. komento:
  53. ```
  54. [09/04/2018 22:01:26 - fincer: ~ ]$ sudo salt 'orja*' grains.item osrelease
  55. orjakone:
  56. ----------
  57. osrelease:
  58. 18.04
  59. ```
  60. Luodaan master-koneelle seuraava shell-skripti */srv/salt/0_create_indexhtml.sh*, joka tuottaa kaikille orjakoneen käyttäjille kansion *public_html* testisivuineen:
  61. ```
  62. #!/bin/sh
  63. # Find home folders of system users (who are using bash as their default shell)
  64. for userhome in $(grep -E "\/bin\/bash" /etc/passwd | grep -v root | awk -F ':' '{print $(NF - 1)}'); do
  65. # Create public_html for found user
  66. if [ ! -d "${userhome}"/public_html ]; then
  67. mkdir -p "${userhome}"/public_html
  68. # Promote this user to be the owner of the created directory
  69. chown $(stat --format "%u:%g" ${userhome}) "${userhome}"/public_html
  70. # Touch default index file for testing purposes
  71. echo "This is my test site. I am user $(stat --format \"%U\" ${userhome}). Happy coding!" > "${userhome}"/public_html/index.html
  72. fi
  73. done
  74. ```
  75. Suoritetaan tehtävänannossa edellytetty Apache HTTP-daemonin asennus minion-koneille:
  76. ```
  77. sudo salt 'orja*' state.apply 0_create_indexhtml
  78. ```
  79. Esimerkki-output (masterilla):
  80. ```
  81. [09/04/2018 21:45:41 - fincer: salt ]$ sudo salt 'orja*' state.apply 0_create_indexhtml
  82. orjakone:
  83. ----------
  84. ID: install_httpd_daemon
  85. Function: pkg.installed
  86. Result: True
  87. Comment: All specified packages are already installed
  88. Started: 03:06:06.583325
  89. Duration: 377.198 ms
  90. Changes:
  91. ----------
  92. ID: httpd_userdir
  93. Function: cmd.run
  94. Name: /usr/sbin/a2enmod userdir
  95. Result: True
  96. Comment: Command "/usr/sbin/a2enmod userdir" run
  97. Started: 03:06:06.962361
  98. Duration: 19.784 ms
  99. Changes:
  100. ----------
  101. pid:
  102. 20406
  103. retcode:
  104. 0
  105. stderr:
  106. stdout:
  107. Module userdir already enabled
  108. ----------
  109. ID: httpd_foo-index
  110. Function: cmd.run
  111. Name: /bin/echo "foo" > /var/www/html/index.html
  112. Result: True
  113. Comment: Command "/bin/echo "foo" > /var/www/html/index.html" run
  114. Started: 03:06:06.982499
  115. Duration: 3.978 ms
  116. Changes:
  117. ----------
  118. pid:
  119. 20411
  120. retcode:
  121. 0
  122. stderr:
  123. stdout:
  124. ----------
  125. ID: execute_public_html
  126. Function: cmd.script
  127. Name: salt://0_create_indexhtml.sh
  128. Result: True
  129. Comment: Command 'salt://0_create_indexhtml.sh' run
  130. Started: 03:06:06.986594
  131. Duration: 415.176 ms
  132. Changes:
  133. ----------
  134. pid:
  135. 20432
  136. retcode:
  137. 0
  138. stderr:
  139. stdout:
  140. ----------
  141. ID: httpd_service_restart_userdir
  142. Function: service.running
  143. Name: apache2.service
  144. Result: True
  145. Comment: Service restarted
  146. Started: 03:06:07.435663
  147. Duration: 124.998 ms
  148. Changes:
  149. ----------
  150. apache2.service:
  151. True
  152. Summary for orjakone
  153. ------------
  154. Succeeded: 5 (changed=4)
  155. Failed: 0
  156. ------------
  157. Total states run: 5
  158. Total run time: 941.134 ms
  159. ```
  160. Minion-koneelta voimme tarkastaa, onko kansio *public_html* ja tiedosto *index.html* luotu (esim. orjakone:en käyttäjälle fincer):
  161. ```
  162. [09/04/2018 21:46:59 - fincer: salt ]$ sudo salt 'orjakone' cmd.run 'cat /home/fincer/public_html/index.html'
  163. orjakone:
  164. This is my test site. I am user "fincer". Happy coding!
  165. ```
  166. c) Laita PHP toimimaan käyttäjien kotisivuilla - Salt (Huomaa, että PHP toimii oletuksena kaikkialla muualla kuin käyttäjien public_html-kotisivuilla.)
  167. --------------
  168. **Vastaus:**
  169. Tehtävässä pitää orjakoneilta (minions) kytkeä PHP päälle userdir-moduulin kanssa editoimalla konfiguraatiotiedostoa /etc/apache2/mods-available/php*.conf (missä * on php-versio).
  170. Tämä vaihe voidaan tehdä kahdella tavalla:
  171. - 1) Luodaan master-koneelle uusi konfiguraatiotiedosto (php*.conf) samalla sisällöllä, mutta kommentoidaan userdir-moduulin edellyttämät rivit tiedostosta (tiedostossa on selkeät ohjeet tähän)
  172. - 2) Luodaan skripti, jonka tehtävänä on lisätä kommenttimerkit orjakoneiden php*.conf -tiedoston relevanttiin osioon
  173. Molemmat vaihtoehdot määritetään suoritettavaksi master:lla Saltin state-tiedostossa. Toteutetaan vaihtoehto 2.
  174. Luodaan master-koneella shell-skripti */srv/salt/1_enable_php-for-userdir.sh* sisällöllä:
  175. ```
  176. #!/bin/sh
  177. # Enable PHP for userdir module in Apache
  178. # Author: Pekka Helenius, 2018
  179. PHP_CONF_FILE="$(ls /etc/apache2/mods-available/php*.conf)"
  180. IFS="
  181. "
  182. for line in $(cat "${PHP_CONF_FILE}" | sed -n '/\<IfModule mod_userdir\.c>/,/\<\/IfModule>/p;/\<\/IfModule>/q'); do
  183. sed_line=$(echo "${line}" | sed 's!\*!\\*!g;')
  184. sed -ir "s!${sed_line}!#${sed_line}!" "${PHP_CONF_FILE}"
  185. done
  186. unset IFS
  187. ```
  188. Luodaan master-koneella toinenkin shell-skripti */srv/salt/1_create_indexphp.sh* seuraavalla sisällöllä:
  189. ```
  190. #!/bin/sh
  191. # Find home folders of system users (who are using bash as their default shell)
  192. for userhome in $(grep -E "\/bin\/bash" /etc/passwd | grep -v root | awk -F ':' '{print $(NF - 1)}'); do
  193. # Create public_html for found user
  194. if [ ! -d "${userhome}"/public_html ]; then
  195. mkdir -p "${userhome}"/public_html
  196. # Promote this user to be the owner of the created directory
  197. chown $(stat --format "%u:%g" ${userhome}) "${userhome}"/public_html
  198. # Rename existing index.html if exists
  199. if [ -f "${userhome}"/public_html/index.html ]; then
  200. mv "${userhome}"/public_html/index.html "${userhome}"/public_html/index.html.old
  201. fi
  202. # Touch default index PHP file for testing purposes
  203. echo "<?php print('This is PHP code. I am user $(stat --format \"%U\" ${userhome}). Happy coding!'); ?>" > "${userhome}"/public_html/index.php
  204. fi
  205. done
  206. ```
  207. Luodaan master-koneelle state-määritystiedosto */srv/salt/1_create_indexphp.sls* sisällöllä:
  208. ```
  209. # Author: Pekka Helenius (~Fincer), 2018
  210. #########################################
  211. # Variables
  212. # PHP module for Apache in Debian
  213. {% set ENABLE_PHP_MODULE = "/usr/sbin/a2enmod $(a2query -m | awk '{print $1}' | grep php)" %}
  214. {% set USERDIR_ENABLE_STATUS = "a2query -m | grep userdir | grep 'enabled by' &>/dev/null || /usr/sbin/a2enmod userdir" %}
  215. #########################################
  216. # Install PHP addons for Apache HTTP daemon (with dependencies)
  217. install_httpd_php:
  218. pkg.installed:
  219. - pkgs:
  220. - apache2
  221. - libapache2-mod-php
  222. #########################################
  223. # Find if userdir module is enabled
  224. check_userdir_status:
  225. cmd.run:
  226. - name: {{ USERDIR_ENABLE_STATUS }}
  227. - require:
  228. - pkg: install_httpd_php
  229. #########################################
  230. # Enable PHP for users
  231. execute_userdir_php_script:
  232. cmd.script:
  233. - name: salt://apache/1_enable_php-for-userdir.sh
  234. - runas: root
  235. - require:
  236. - cmd: check_userdir_status
  237. add_indexphp_files:
  238. cmd.script:
  239. - name: salt://apache/1_create_indexphp.sh
  240. - runas: root
  241. - require:
  242. - cmd: execute_userdir_php_script
  243. #########################################
  244. # Enable PHP module (should be done already, though)
  245. enable_httpd_php:
  246. cmd.run:
  247. - name: {{ ENABLE_PHP_MODULE }}
  248. #########################################
  249. # Restart Apache HTTP daemon
  250. httpd_service_restart_php:
  251. service.running:
  252. - name: apache2.service
  253. - watch:
  254. - cmd: check_userdir_status
  255. - cmd: execute_userdir_php_script
  256. ```
  257. Esimerkki-output master-koneella:
  258. ```
  259. [09/04/2018 23:13:27 - fincer: ~ ]$ sudo salt 'orjakone' state.apply 1_create_indexphp
  260. orjakone:
  261. ----------
  262. ID: install_httpd_php
  263. Function: pkg.installed
  264. Result: True
  265. Comment: All specified packages are already installed
  266. Started: 03:12:05.777863
  267. Duration: 387.502 ms
  268. Changes:
  269. ----------
  270. ID: check_userdir_status
  271. Function: cmd.run
  272. Name: a2query -m | grep userdir | grep 'enabled by' &>/dev/null || /usr/sbin/a2enmod userdir
  273. Result: True
  274. Comment: Command "a2query -m | grep userdir | grep 'enabled by' &>/dev/null || /usr/sbin/a2enmod userdir" run
  275. Started: 03:12:06.167690
  276. Duration: 37.4 ms
  277. Changes:
  278. ----------
  279. pid:
  280. 20663
  281. retcode:
  282. 0
  283. stderr:
  284. stdout:
  285. userdir (enabled by site administrator)
  286. ----------
  287. ID: execute_userdir_php_script
  288. Function: cmd.script
  289. Name: salt://1_enable_php-for-userdir.sh
  290. Result: True
  291. Comment: Command 'salt://1_enable_php-for-userdir.sh' run
  292. Started: 03:12:06.206077
  293. Duration: 192.94 ms
  294. Changes:
  295. ----------
  296. pid:
  297. 20690
  298. retcode:
  299. 0
  300. stderr:
  301. stdout:
  302. ----------
  303. ID: add_indexphp_files
  304. Function: cmd.script
  305. Name: salt://1_create_indexphp.sh
  306. Result: True
  307. Comment: Command 'salt://1_create_indexphp.sh' run
  308. Started: 03:12:06.399689
  309. Duration: 142.251 ms
  310. Changes:
  311. ----------
  312. pid:
  313. 20734
  314. retcode:
  315. 0
  316. stderr:
  317. stdout:
  318. ----------
  319. ID: enable_httpd_php
  320. Function: cmd.run
  321. Name: /usr/sbin/a2enmod $(a2query -m | awk '{print $1}' | grep php)
  322. Result: True
  323. Comment: Command "/usr/sbin/a2enmod $(a2query -m | awk '{print $1}' | grep php)" run
  324. Started: 03:12:06.542066
  325. Duration: 68.876 ms
  326. Changes:
  327. ----------
  328. pid:
  329. 20741
  330. retcode:
  331. 0
  332. stderr:
  333. stdout:
  334. Considering dependency mpm_prefork for php7.2:
  335. Considering conflict mpm_event for mpm_prefork:
  336. Considering conflict mpm_worker for mpm_prefork:
  337. Module mpm_prefork already enabled
  338. Considering conflict php5 for php7.2:
  339. Module php7.2 already enabled
  340. ----------
  341. ID: httpd_service_restart_php
  342. Function: service.running
  343. Name: apache2.service
  344. Result: True
  345. Comment: Service restarted
  346. Started: 03:12:06.635009
  347. Duration: 87.188 ms
  348. Changes:
  349. ----------
  350. apache2.service:
  351. True
  352. Summary for orjakone
  353. ------------
  354. Succeeded: 6 (changed=5)
  355. Failed: 0
  356. ------------
  357. Total states run: 6
  358. Total run time: 916.157 ms
  359. ```
  360. d) Rakenna tila (state), joka tekee Apachelle uuden nimipohjaisen virtuaalipalvelimen (name based virtual hosting). Voit simuloida nimipalvelun toimintaa hosts-tiedoston avulla.
  361. --------------
  362. **Vastaus:**
  363. **HUOM!** Tämän olisi voinut tehdä myös luomalla esim. index.html- ja sivustokonfiguraatiotiedostot masterilla, josta ne siirrettäisiin minioneille (file). Nämä määritykset tehdään state-tiedostossa, luonnollisesti. Paljon parempi tapa, jos on esimerkiksi tarkoitus laittaa juuri samansisältöinen _/etc/apache2/sites-available/*.conf_ -tiedosto/template ja samansisältöinen, masterilta päivitettävissä oleva index.html -tiedosto minioneille. Tein nyt huvikseni seuraavalla tavalla, vaikka tiedän, ettei se nyt ihan nappiin menekkään.
  364. Luodaan master-koneen */srv/salt/* -kansioon state/konfiguraatiotiedosto *apache_virtualhost_example.sls* sisällöllä:
  365. ```
  366. # Author: Pekka Helenius (~Fincer), 2018
  367. #########################################
  368. # Install Apache HTTP daemon to minions
  369. install_httpd_daemon:
  370. pkg.installed:
  371. - pkgs:
  372. - apache2
  373. #########################################
  374. copy_httpd_defaultsite:
  375. cmd.run:
  376. - name: '[ ! -f /etc/apache2/sites-available/$(hostname)-example.conf ] && cd /etc/apache2/sites-available && cp 000-default.conf $(hostname)-example.conf || false'
  377. - require:
  378. - pkg: install_httpd_daemon
  379. create_site_rootdir:
  380. cmd.run:
  381. - name: /bin/mkdir -p /var/www/html/$(hostname)
  382. - require:
  383. - pkg: install_httpd_daemon
  384. enable_httpd_servername:
  385. cmd.run:
  386. - name: /bin/sed -i "s/#ServerName www\.example\.com/ServerName $(hostname).example.com/" /etc/apache2/sites-available/$(hostname)-example.conf
  387. - require:
  388. - cmd: copy_httpd_defaultsite
  389. change_defaultsite_root:
  390. cmd.run:
  391. - name: /bin/sed -i "s/DocumentRoot \/var\/www\/html/DocumentRoot \/var\/www\/html\/$(hostname)/" /etc/apache2/sites-available/$(hostname)-example.conf
  392. - require:
  393. - cmd: enable_httpd_servername
  394. enable_httpd_defaultsite:
  395. cmd.run:
  396. - name: /usr/sbin/a2ensite $(hostname)-example.conf
  397. - require:
  398. - cmd: change_defaultsite_root
  399. - cmd: copy_httpd_defaultsite
  400. - pkg: install_httpd_daemon
  401. add_virtualhost_string:
  402. cmd.run:
  403. - name: /bin/echo "127.0.0.1 $(hostname).example.com" > /etc/hosts
  404. - require:
  405. - cmd: enable_httpd_defaultsite
  406. add_defaultsite_indexfile:
  407. cmd.run:
  408. - name: '[ ! -f /var/www/html/$(hostname)/index.html ] && /bin/echo "This is default HTML template for $(hostname) ($(hostname).example.com), created on $(date \"+%d-%m-%Y at %X\")" > /var/www/html/$(hostname)/index.html'
  409. - require:
  410. - cmd: create_site_rootdir
  411. - cmd: add_virtualhost_string
  412. - cmd: enable_httpd_defaultsite
  413. restart_httpd_service:
  414. service.running:
  415. - name: apache2.service
  416. - watch:
  417. - cmd: enable_httpd_defaultsite
  418. - cmd: add_defaultsite_indexfile
  419. ```
  420. Ajetaan em. state masterilta minion-koneelle nimeltä "orjakone" (vain tälle yhdelle koneelle, ei muita orjia nyt!):
  421. ```
  422. [10/04/2018 00:13:12 - fincer: ~ ]$ sudo salt 'orjakone' state.apply apache_virtualhost_example
  423. orjakone:
  424. ----------
  425. ID: install_httpd_daemon
  426. Function: pkg.installed
  427. Result: True
  428. Comment: All specified packages are already installed
  429. Started: 05:20:27.160570
  430. Duration: 360.254 ms
  431. Changes:
  432. ----------
  433. ID: copy_httpd_defaultsite
  434. Function: cmd.run
  435. Name: [ ! -f /etc/apache2/sites-available/$(hostname)-example.conf ] && cd /etc/apache2/sites-available && cp 000-default.conf $(hostname)-example.conf || false
  436. Result: False
  437. Comment: Command "[ ! -f /etc/apache2/sites-available/$(hostname)-example.conf ] && cd /etc/apache2/sites-available && cp 000-default.conf $(hostname)-example.conf || false" run
  438. Started: 05:20:27.522609
  439. Duration: 4.361 ms
  440. Changes:
  441. ----------
  442. pid:
  443. 22444
  444. retcode:
  445. 1
  446. stderr:
  447. stdout:
  448. ----------
  449. ID: create_site_rootdir
  450. Function: cmd.run
  451. Name: /bin/mkdir -p /var/www/html/$(hostname)
  452. Result: True
  453. Comment: Command "/bin/mkdir -p /var/www/html/$(hostname)" run
  454. Started: 05:20:27.527146
  455. Duration: 3.26 ms
  456. Changes:
  457. ----------
  458. pid:
  459. 22446
  460. retcode:
  461. 0
  462. stderr:
  463. stdout:
  464. ----------
  465. ID: enable_httpd_servername
  466. Function: cmd.run
  467. Name: /bin/sed -i "s/#ServerName www\.example\.com/ServerName $(hostname).example.com/" /etc/apache2/sites-available/$(hostname)-example.conf
  468. Result: False
  469. Comment: One or more requisite failed: apache_virtualhost_example.copy_httpd_defaultsite
  470. Changes:
  471. ----------
  472. ID: change_defaultsite_root
  473. Function: cmd.run
  474. Name: /bin/sed -i "s/DocumentRoot \/var\/www\/html/DocumentRoot \/var\/www\/html\/$(hostname)/" /etc/apache2/sites-available/$(hostname)-example.conf
  475. Result: False
  476. Comment: One or more requisite failed: apache_virtualhost_example.enable_httpd_servername
  477. Changes:
  478. ----------
  479. ID: enable_httpd_defaultsite
  480. Function: cmd.run
  481. Name: /usr/sbin/a2ensite $(hostname)-example.conf
  482. Result: False
  483. Comment: One or more requisite failed: apache_virtualhost_example.copy_httpd_defaultsite, apache_virtualhost_example.change_defaultsite_root
  484. Changes:
  485. ----------
  486. ID: add_virtualhost_string
  487. Function: cmd.run
  488. Name: /bin/echo "127.0.0.1 $(hostname).example.com" > /etc/hosts
  489. Result: False
  490. Comment: One or more requisite failed: apache_virtualhost_example.enable_httpd_defaultsite
  491. Changes:
  492. ----------
  493. ID: add_defaultsite_indexfile
  494. Function: cmd.run
  495. Name: [ ! -f /var/www/html/$(hostname)/index.html ] && /bin/echo "This is default HTML template for $(hostname) ($(hostname).example.com), created on $(date \"+%d-%m-%Y at %X\")" > /var/www/html/$(hostname)/index.html
  496. Result: False
  497. Comment: One or more requisite failed: apache_virtualhost_example.add_virtualhost_string, apache_virtualhost_example.enable_httpd_defaultsite
  498. Changes:
  499. ----------
  500. ID: restart_httpd_service
  501. Function: service.running
  502. Name: apache2.service
  503. Result: False
  504. Comment: One or more requisite failed: apache_virtualhost_example.add_defaultsite_indexfile, apache_virtualhost_example.enable_httpd_defaultsite
  505. Changes:
  506. Summary for orjakone
  507. ------------
  508. Succeeded: 2 (changed=2)
  509. Failed: 7
  510. ------------
  511. Total states run: 9
  512. Total run time: 367.875 ms
  513. ```
  514. Hups! Epäonnistumisia, emämunaus. Ihan odotettua, sillä...
  515. ...epäonnistumiset johtuvat siitä, että olen määritellyt tietyt ID:t, kuten tässä tapauksessa ehkä kriittisimpänä copy_httpd_defaultsite:n, palauttamaan komennon suorittamisesta arvon false, mikäli mm. tiedosto $(hostname)-example.conf on jo olemassa. Koska kyseinen ID on riippuvuutena alemmille ID:ille, ja nämä ID:t edelleen riippuvuutena eteenpäin muille ID:lle, syntyy ketjureaktio, jossa epäonnistuneita tiloja tulee suuri määrä. Tässä tapauksessa 7 kpl. Tulos oli odotettu _tässä konfiguraatiossa_.
  516. Orjakoneen selainnäkymässä (*xdg-open http://$(hostname).example.com*) ajettuna lopputulos näyttää tältä:
  517. ![minion-virtualhost](https://raw.githubusercontent.com/Fincer-altego/central-management-of-multiple-servers/master/images/minion-example.png)
  518. e) Tee tila, joka laittaa esimerkkikotisivun uusille käyttäjille. Voit laittaa esimerkkikotisivu /etc/skel/:iin, niin se tulee automaattisesti ‘adduser tero’ komennolla käyttäjiä luodessa.
  519. --------------
  520. **Vastaus:**
  521. **HUOM!** Tämä on osittain tehtynä jo vastauksissa b) ja c) (Mitä on tehty: On luotu jokaiselle käyttäjälle index.html (b) ja PHP:n kytkemisen yhteydessä index.php (c))
  522. **HUOM!** Tässä olisi voinut hyödyntää esim. kansiorakennetta _/srv/salt/apache_, jonne laitettu state-tiedostot. Nyt toimitaan vielä yksinkertaisemmalla pohjalla, minkä takia state-tiedostoissa esiintyy päällekkäisyyttä. Monimutkaisemmissa konfiguraatioissa puu-rakennetta olisi hyvä harkita (mandatory?).
  523. Lisätään state *2_apache_skelsite.sls*, joka lisää esimerkkikotisivun määriteltyjen minion-koneiden hakemistoon _/etc/skel_ (teemme alihakemiston *public_html* tänne state-tiedostossa...):
  524. ```
  525. # Author: Pekka Helenius (~Fincer), 2018
  526. #########################################
  527. # Install Apache HTTP daemon to minions
  528. install_httpd_daemon:
  529. pkg.installed:
  530. - pkgs:
  531. - apache2
  532. #########################################
  533. # Enable Apache userdir module
  534. httpd_userdir:
  535. cmd.run:
  536. - name: /usr/sbin/a2enmod userdir
  537. - require:
  538. - pkg: install_httpd_daemon
  539. #########################################
  540. # Replace default index.html content
  541. httpd_foo-index:
  542. cmd.run:
  543. - name: /bin/echo "foo" > /var/www/html/index.html
  544. - require:
  545. - cmd: httpd_userdir
  546. - pkg: install_httpd_daemon
  547. #########################################
  548. # Restart Apache HTTP daemon
  549. httpd_service_restart_skelsite:
  550. service.running:
  551. - name: apache2.service
  552. - watch:
  553. - cmd: httpd_userdir
  554. #########################################
  555. # Create /etc/skel/public_html
  556. apache_add_skel_html_dir:
  557. cmd.run:
  558. - name: /bin/mkdir -p /etc/skel/public_html
  559. - require:
  560. - service: httpd_service_restart_skelsite
  561. #########################################
  562. # Add index.html
  563. apache_default_userindex_file:
  564. cmd.run:
  565. - name: /bin/echo "Empty HTML template" > /etc/skel/public_html/index.html
  566. - require:
  567. - cmd: apache_add_skel_html_dir
  568. ```
  569. Master-koneen output:
  570. ```
  571. [10/04/2018 01:15:01 - fincer: ~ ]$ sudo salt 'orjakone' state.apply 2_apache_skelsite
  572. orjakone:
  573. ----------
  574. ID: install_httpd_daemon
  575. Function: pkg.installed
  576. Result: True
  577. Comment: All specified packages are already installed
  578. Started: 03:46:46.743389
  579. Duration: 368.537 ms
  580. Changes:
  581. ----------
  582. ID: httpd_userdir
  583. Function: cmd.run
  584. Name: /usr/sbin/a2enmod userdir
  585. Result: True
  586. Comment: Command "/usr/sbin/a2enmod userdir" run
  587. Started: 03:46:47.113788
  588. Duration: 21.611 ms
  589. Changes:
  590. ----------
  591. pid:
  592. 21155
  593. retcode:
  594. 0
  595. stderr:
  596. stdout:
  597. Module userdir already enabled
  598. ----------
  599. ID: httpd_foo-index
  600. Function: cmd.run
  601. Name: /bin/echo "foo" > /var/www/html/index.html
  602. Result: True
  603. Comment: Command "/bin/echo "foo" > /var/www/html/index.html" run
  604. Started: 03:46:47.135793
  605. Duration: 4.274 ms
  606. Changes:
  607. ----------
  608. pid:
  609. 21160
  610. retcode:
  611. 0
  612. stderr:
  613. stdout:
  614. ----------
  615. ID: httpd_service_restart_skelsite
  616. Function: service.running
  617. Name: apache2.service
  618. Result: True
  619. Comment: Service restarted
  620. Started: 03:46:47.161935
  621. Duration: 103.555 ms
  622. Changes:
  623. ----------
  624. apache2.service:
  625. True
  626. ----------
  627. ID: apache_add_skel_html_dir
  628. Function: cmd.run
  629. Name: /bin/mkdir -p /etc/skel/public_html
  630. Result: True
  631. Comment: Command "/bin/mkdir -p /etc/skel/public_html" run
  632. Started: 03:46:47.265901
  633. Duration: 73.066 ms
  634. Changes:
  635. ----------
  636. pid:
  637. 21178
  638. retcode:
  639. 0
  640. stderr:
  641. stdout:
  642. ----------
  643. ID: apache_default_userindex_file
  644. Function: cmd.run
  645. Name: /bin/echo "Empty HTML template" > /etc/skel/public_html/index.html
  646. Result: True
  647. Comment: Command "/bin/echo "Empty HTML template" > /etc/skel/public_html/index.html" run
  648. Started: 03:46:47.341257
  649. Duration: 13.803 ms
  650. Changes:
  651. ----------
  652. pid:
  653. 21185
  654. retcode:
  655. 0
  656. stderr:
  657. stdout:
  658. Summary for orjakone
  659. ------------
  660. Succeeded: 6 (changed=5)
  661. Failed: 0
  662. ------------
  663. Total states run: 6
  664. Total run time: 584.846 ms
  665. ```
  666. Minion-koneelta tarkistusta (master-koneella katsottuna):
  667. ```
  668. [10/04/2018 02:54:51 - fincer: ~ ]$ sudo salt 'orjakone' cmd.run '/bin/ls /etc/skel && [ -d /etc/skel/public_html ] && /bin/cat /etc/skel/public_html/*'
  669. orjakone:
  670. index.html
  671. public_html
  672. Empty HTML template
  673. ```
  674. f) Eri asetukset. Tee Package-File-Service tilalla eri asetuksia kuin ne, mitä tehtiin tunnilla; ja eri kuin mitä teit/teet h2 muissa kohdissa. Voit muuttaa jotain toista asetusta samoista demoneista tai valita kokonaan eri demonit.
  675. --------------
  676. **Vastaus:**
  677. Toteutetaan Knock daemonin (knockd - small port-knock daemon) -asennus.
  678. Luodaan master-koneelle tiedosto */srv/salt/knockd.conf*, joka annetaan valituille minioneille (asennetaan polkuun */etc/knockd.conf*)
  679. Haluttu *knockd.conf*:n sisältö (_/srv/salt/knockd.conf_):
  680. ```
  681. [options]
  682. UseSyslog
  683. [openSSH]
  684. sequence = tcp:7065,udp:2431,tcp:421,tcp:4113
  685. seq_timeout = 5
  686. command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
  687. tcpflags = syn
  688. [closeSSH]
  689. sequence = tcp:4113,tcp:421,udp:2431,tcp:7065
  690. seq_timeout = 5
  691. command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
  692. tcpflags = syn
  693. ```
  694. Luodaan master-koneelle state-tiedosto _/srv/salt/install_knockd.sls_:
  695. ```
  696. # Author: Pekka Helenius (~Fincer), 2018
  697. #########################################
  698. # Install Knock daemon to minions
  699. check_ssh:
  700. pkg.installed:
  701. - pkgs:
  702. - ssh
  703. install_knockd:
  704. pkg.installed:
  705. - pkgs:
  706. - knockd
  707. # Deliver Knock daemon configuration file to minions
  708. deliver_knockd-conf:
  709. file.managed:
  710. - name: /etc/knockd.conf
  711. - user: root
  712. - group: root
  713. - mode: 644
  714. - source: salt://knockd.conf
  715. - require:
  716. - pkg: install_knockd
  717. # Do not proceed if any SSH sessions are open in minion's side. This is just to avoid any harmful effects
  718. prevent_if_ssh_sessions_open:
  719. cmd.run:
  720. - name: 'if [ $(/bin/netstat -tnpa | grep "ESTABLISHED.*sshd" | wc -l) -gt 0 ]; then false; fi'
  721. - require:
  722. - pkg: check_ssh
  723. # PROCEED ONLY IF NO SSH SESSIONS ARE OPEN
  724. #
  725. # Drop SSH port connections. Use port which is defined in minion's /etc/ssh/sshd_config file
  726. drop_ssh_port:
  727. cmd.run:
  728. - name: /sbin/iptables -A INPUT -p tcp --dport $(grep -E ^[#P]+ort /etc/ssh/sshd_config | awk '{print $2}') -j DROP
  729. - require:
  730. - cmd: prevent_if_ssh_sessions_open
  731. - pkg: check_ssh
  732. - file: deliver_knockd-conf
  733. # Change default SSH port 22 in minion's /etc/knockd.conf file:
  734. post-configure_knockd-conf:
  735. cmd.run:
  736. - name: /bin/sed -i "s/dport 22/dport $(grep -E ^[#P]+ort /etc/ssh/sshd_config | awk '{print $2}')/" /etc/knockd.conf
  737. - require:
  738. - pkg: check_ssh
  739. - file: deliver_knockd-conf
  740. # Enable knockd daemon
  741. enable_knockd_service:
  742. cmd.run:
  743. - name: /bin/systemctl enable knockd.service
  744. - require:
  745. - pkg: install_knockd
  746. # Restart knockd daemon
  747. restart_knockd_service:
  748. service.running:
  749. - name: knockd.service
  750. - watch:
  751. - cmd: post-configure_knockd-conf
  752. ```
  753. Esimerkki-output master-koneella ajettuna:
  754. ```
  755. [10/04/2018 06:17:11 - fincer: ~ ]$ sudo salt 'orjakone' state.apply install_knockd
  756. orjakone:
  757. ----------
  758. ID: check_ssh
  759. Function: pkg.installed
  760. Result: True
  761. Comment: All specified packages are already installed
  762. Started: 06:25:12.849731
  763. Duration: 366.695 ms
  764. Changes:
  765. ----------
  766. ID: install_knockd
  767. Function: pkg.installed
  768. Result: True
  769. Comment: The following packages were installed/updated: knockd
  770. Started: 06:25:13.216541
  771. Duration: 53498.645 ms
  772. Changes:
  773. ----------
  774. knockd:
  775. ----------
  776. new:
  777. 0.7-1ubuntu1
  778. old:
  779. ----------
  780. ID: deliver_knockd-conf
  781. Function: file.managed
  782. Name: /etc/knockd.conf
  783. Result: True
  784. Comment: File /etc/knockd.conf updated
  785. Started: 06:26:06.717147
  786. Duration: 17.544 ms
  787. Changes:
  788. ----------
  789. diff:
  790. ---
  791. +++
  792. @@ -1,15 +1,14 @@
  793. [options]
  794. - UseSyslog
  795. + UseSyslog
  796. [openSSH]
  797. - sequence = 7000,8000,9000
  798. - seq_timeout = 5
  799. - command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
  800. - tcpflags = syn
  801. + sequence = tcp:7065,udp:2431,tcp:421,tcp:4113
  802. + seq_timeout = 5
  803. + command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
  804. + tcpflags = syn
  805. [closeSSH]
  806. - sequence = 9000,8000,7000
  807. - seq_timeout = 5
  808. - command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
  809. - tcpflags = syn
  810. -
  811. + sequence = tcp:4113,tcp:421,udp:2431,tcp:7065
  812. + seq_timeout = 5
  813. + command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
  814. + tcpflags = syn
  815. ----------
  816. ID: prevent_if_ssh_sessions_open
  817. Function: cmd.run
  818. Name: if [ $(/bin/netstat -tnpa | grep "ESTABLISHED.*sshd" | wc -l) -gt 0 ]; then false; fi
  819. Result: True
  820. Comment: Command "if [ $(/bin/netstat -tnpa | grep "ESTABLISHED.*sshd" | wc -l) -gt 0 ]; then false; fi" run
  821. Started: 06:26:06.735404
  822. Duration: 59.527 ms
  823. Changes:
  824. ----------
  825. pid:
  826. 23916
  827. retcode:
  828. 0
  829. stderr:
  830. stdout:
  831. ----------
  832. ID: drop_ssh_port
  833. Function: cmd.run
  834. Name: /sbin/iptables -A INPUT -p tcp --dport $(grep -E ^[#P]+ort /etc/ssh/sshd_config | awk '{print $2}') -j DROP
  835. Result: True
  836. Comment: Command "/sbin/iptables -A INPUT -p tcp --dport $(grep -E ^[#P]+ort /etc/ssh/sshd_config | awk '{print $2}') -j DROP" run
  837. Started: 06:26:06.795619
  838. Duration: 457.367 ms
  839. Changes:
  840. ----------
  841. pid:
  842. 23927
  843. retcode:
  844. 0
  845. stderr:
  846. stdout:
  847. ----------
  848. ID: post-configure_knockd-conf
  849. Function: cmd.run
  850. Name: /bin/sed -i "s/dport 22/dport $(grep -E ^[#P]+ort /etc/ssh/sshd_config | awk '{print $2}')/" /etc/knockd.conf
  851. Result: True
  852. Comment: Command "/bin/sed -i "s/dport 22/dport $(grep -E ^[#P]+ort /etc/ssh/sshd_config | awk '{print $2}')/" /etc/knockd.conf" run
  853. Started: 06:26:07.253529
  854. Duration: 16.545 ms
  855. Changes:
  856. ----------
  857. pid:
  858. 23963
  859. retcode:
  860. 0
  861. stderr:
  862. stdout:
  863. ----------
  864. ID: enable_knockd_service
  865. Function: cmd.run
  866. Name: /bin/systemctl enable knockd.service
  867. Result: True
  868. Comment: Command "/bin/systemctl enable knockd.service" run
  869. Started: 06:26:07.270551
  870. Duration: 539.568 ms
  871. Changes:
  872. ----------
  873. pid:
  874. 23968
  875. retcode:
  876. 0
  877. stderr:
  878. stdout:
  879. ----------
  880. ID: restart_knockd_service
  881. Function: service.running
  882. Name: knockd.service
  883. Result: True
  884. Comment: Started Service knockd.service
  885. Started: 06:26:08.461999
  886. Duration: 168.812 ms
  887. Changes:
  888. ----------
  889. knockd.service:
  890. True
  891. Summary for orjakone
  892. ------------
  893. Succeeded: 8 (changed=7)
  894. Failed: 0
  895. ------------
  896. Total states run: 8
  897. Total run time: 55.125 s
  898. ```
  899. Esimerkkikuva minion-koneen Knock daemonin konfiguraatiotiedostosta, jossa on vaihdettu porttinumero sen mukaan kuin se on määritelty minion-koneen SSH-asetuksissa:
  900. ![minion-knockd-sample](https://raw.githubusercontent.com/Fincer-altego/central-management-of-multiple-servers/master/images/minion-knockd-example.png)