diff --git a/h3.md b/h3.md new file mode 100644 index 0000000..6b3ca36 --- /dev/null +++ b/h3.md @@ -0,0 +1,506 @@ +Palvelinten hallinta - Harjoitus 3 +============== + +*Disclaimer:* +-------------- + +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. + + +**b)** Tiedosto muotista: tee yksinkertainen SLS-tilatiedosto, joka laittaa muuttujan tiedostoon. Käytä jinjan kontekstimuuttujaa (template: jinja, context: ...). +-------------- + +**Vastaus:** + +Luodaan tiedosto _/srv/salt/firstninja.sls_ seuraavalla sisällöllä (sudo nano /srv/salt/firstninja.sls): + +(Tehtävänannon vaatimus täyttyy state:ssa _put_my_foo_stuff_) + + +``` +hostile_secondgroup: + group.present: + - name: foobar + - gid: 666 + - system: True + +hostile_user: + user.present: + - name: evilninja + - fullname: Evil Ninja + - uid: 666 + - gid: 666 + - shell: /bin/bash + - home: /home/foo + - groups: + - foobar + - require: + - group: hostile_secondgroup + +put_my_foo_stuff: + file.managed: + - name: /foo/mysecretfoo + - source: salt://foofile + - makedirs: True + - user: 666 + - group: 666 + - mode: 0744 + - template: jinja + - context: + supersecretfoo: 'you never know where this came from' + notsosecretbar: 'wanna beer?' + - require: + - user: hostile_user + +foo_executable: + file.symlink: + - name: /usr/local/bin/mysecretfoo + - target: /foo/mysecretfoo + - require: + - file: put_my_foo_stuff + +evil_nullfiles: + cmd.run: + - name: 'touch ./foo_everywhere' + - cwd: /foo + - creates: foo_everywhere + - creates: foofoo + - require: + - file: put_my_foo_stuff + +identity_crisis: + cmd.run: + - name: /usr/bin/id -a + - runas: evilninja + - require: + - user: hostile_user + +haha_execute: + cmd.run: + - shell: /bin/sh + - name: mysecretfoo + - require: + - user: hostile_user + - file: foo_executable +``` + +Lisätään masterille tiedosto _/srv/salt/foofile_ seuraavalla sisällöllä (sudo nano /srv/salt/foofile): + +``` +#!/bin/sh + +echo -e "{{ supersecretfoo }}\n{{ notsosecretbar }}" +``` + +Tämä tiedosto kirjoitetaan minionin/minioneiden kohteeseen _/foo/mysecretfoo_ ja luodaan symbolinen linkki _/usr/local/bin/mysecretfoo_. + +Testataan toimivuus harjoituksessa 1 ja 2 käytetyllä master-minion -tietokonekokoonpanolla (master: master, minion: orjakone): + +``` +sudo salt 'orjakone' state.apply firstninja +``` + +Masterilla tulostettu output: + +``` +orjakone: +---------- + ID: hostile_secondgroup + Function: group.present + Name: foobar + Result: True + Comment: Group foobar is present and up to date + Started: 21:52:22.010941 + Duration: 1.317 ms + Changes: +---------- + ID: hostile_user + Function: user.present + Name: evilninja + Result: True + Comment: User evilninja is present and up to date + Started: 21:52:22.012741 + Duration: 13.69 ms + Changes: +---------- + ID: put_my_foo_stuff + Function: file.managed + Name: /foo/mysecretfoo + Result: True + Comment: File /foo/mysecretfoo is in the correct state + Started: 21:52:22.027375 + Duration: 10.438 ms + Changes: +---------- + ID: foo_executable + Function: file.symlink + Name: /usr/local/bin/mysecretfoo + Result: True + Comment: Created new symlink /usr/local/bin/mysecretfoo -> /foo/mysecretfoo + Started: 21:52:22.038030 + Duration: 26.087 ms + Changes: + ---------- + new: + /usr/local/bin/mysecretfoo +---------- + ID: evil_nullfiles + Function: cmd.run + Name: touch ./foo_everywhere + Result: True + Comment: Command "touch ./foo_everywhere" run + Started: 21:52:22.066037 + Duration: 8.669 ms + Changes: + ---------- + pid: + 3426 + retcode: + 0 + stderr: + stdout: +---------- + ID: identity_crisis + Function: cmd.run + Name: /usr/bin/id -a + Result: True + Comment: Command "/usr/bin/id -a" run + Started: 21:52:22.074865 + Duration: 158.997 ms + Changes: + ---------- + pid: + 3450 + retcode: + 0 + stderr: + stdout: + uid=666(evilninja) gid=666(foobar) groups=666(foobar) +---------- + ID: haha_execute + Function: cmd.run + Name: mysecretfoo + Result: True + Comment: Command "mysecretfoo" run + Started: 21:52:22.234242 + Duration: 14.473 ms + Changes: + ---------- + pid: + 3455 + retcode: + 0 + stderr: + stdout: + -e you never know where this came from + wanna beer? + +Summary for orjakone +------------ +Succeeded: 7 (changed=4) +Failed: 0 +------------ +Total states run: 7 +Total run time: 233.671 ms +``` + +**c)** SLS tilaa Jinjalla: tee yksinkertainen SLS-tilatiedosto, joka käyttää for-in -silmukaa. Voit esimerkiksi tehdä kolme tiedostoa silmukalla. (Tässä tehtävässä siis käytetään jinjaa vain SLS-tiedoston sisällä, älä sotke samaan esimerkkiin tekstitiedostojen sisällön muuttamista.) +-------------- + +**Vastaus:** + +Luodaan master:lle tiedosto _/srv/salt/first_jinjaloop.sls_ seuraavalla sisällöllä (sudo nano /srv/salt/first_jinjaloop.sls): + +``` +{% for loplop in ['round_1', 'round_2', 'round_3', 'round_4'] %} + +loopsloops_noops{{ loop.index }}: + file.managed: + - name: /tmp/loopnoops/{{ loplop }} + - source: salt://loops/jinjaninja_loop + - makedirs: True + - template: jinja + - context: + filenumber: {{ loplop }} + +run_fatboy_run_{{ loop.index }}: + cmd.run: + - name: cat /tmp/loopnoops/{{ loplop }} + - require: + - file: loopsloops_noops{{ loop.index }} + +{% endfor %} + +``` + +Luodaan masterilla tiedosto */srv/salt/loops/jinjaninja_loop*: + +``` +sudo mkdir -p /srv/salt/loops +echo "Loops loops noops {{ filenumber }}" | sudo tee /srv/salt/loops/jinjaninja_loop +``` + +Ajetaan luotu state-tiedosto masterilta orjakone-minionille: + +``` +sudo salt 'orjakone' state.apply first_jinjaloop +``` + +Masterilta saatu output: + +``` +orjakone: +---------- + ID: loopsloops_noops1 + Function: file.managed + Name: /tmp/loopnoops/round_1 + Result: True + Comment: File /tmp/loopnoops/round_1 updated + Started: 22:15:48.402678 + Duration: 22.99 ms + Changes: + ---------- + diff: + New file + mode: + 0644 +---------- + ID: run_fatboy_run_1 + Function: cmd.run + Name: cat /tmp/loopnoops/round_1 + Result: True + Comment: Command "cat /tmp/loopnoops/round_1" run + Started: 22:15:48.426279 + Duration: 9.155 ms + Changes: + ---------- + pid: + 3654 + retcode: + 0 + stderr: + stdout: + Loops loops noops round_1 +---------- + ID: loopsloops_noops2 + Function: file.managed + Name: /tmp/loopnoops/round_2 + Result: True + Comment: File /tmp/loopnoops/round_2 updated + Started: 22:15:48.435550 + Duration: 18.288 ms + Changes: + ---------- + diff: + New file + mode: + 0644 +---------- + ID: run_fatboy_run_2 + Function: cmd.run + Name: cat /tmp/loopnoops/round_2 + Result: True + Comment: Command "cat /tmp/loopnoops/round_2" run + Started: 22:15:48.454122 + Duration: 5.179 ms + Changes: + ---------- + pid: + 3656 + retcode: + 0 + stderr: + stdout: + Loops loops noops round_2 +---------- + ID: loopsloops_noops3 + Function: file.managed + Name: /tmp/loopnoops/round_3 + Result: True + Comment: File /tmp/loopnoops/round_3 updated + Started: 22:15:48.459403 + Duration: 19.723 ms + Changes: + ---------- + diff: + New file + mode: + 0644 +---------- + ID: run_fatboy_run_3 + Function: cmd.run + Name: cat /tmp/loopnoops/round_3 + Result: True + Comment: Command "cat /tmp/loopnoops/round_3" run + Started: 22:15:48.479414 + Duration: 6.602 ms + Changes: + ---------- + pid: + 3658 + retcode: + 0 + stderr: + stdout: + Loops loops noops round_3 +---------- + ID: loopsloops_noops4 + Function: file.managed + Name: /tmp/loopnoops/round_4 + Result: True + Comment: File /tmp/loopnoops/round_4 updated + Started: 22:15:48.486128 + Duration: 18.883 ms + Changes: + ---------- + diff: + New file + mode: + 0644 +---------- + ID: run_fatboy_run_4 + Function: cmd.run + Name: cat /tmp/loopnoops/round_4 + Result: True + Comment: Command "cat /tmp/loopnoops/round_4" run + Started: 22:15:48.505300 + Duration: 9.609 ms + Changes: + ---------- + pid: + 3660 + retcode: + 0 + stderr: + stdout: + Loops loops noops round_4 + +Summary for orjakone +------------ +Succeeded: 8 (changed=8) +Failed: 0 +------------ +Total states run: 8 +Total run time: 110.429 ms + +``` + +**d)** SSH-demonin portti: tee tila, joka asentaa SSH-demonin valittuun porttiin. Käytä portin valintaan Jinjaa, siten että sshd_config:issa “Port:”-kohdan arvo tulee Jinjan muuttujasta. +-------------- + +**Vastaus:** + +Halusin kokeilla jinja:lla lukujen generointia tässä tehtävässä. Olisi voitu toki käyttää ennalta määriteltyä porttia, mutta hauskempaa generoida jotain satunnaista. Soveltuuko tämä käyttökohteeseen, it's up to you. + +SSH-portti generoidaan väliltä 23-600. Käytetään seuraavaa sisältöä uuteen state-tiedostoon. + +Luodaan masterille tiedosto _srv/salt/ssh_random/init.sls_ (sudo mkdir -p /srv/salt/ssh_random && sudo nano /srv/salt/ssh_random/init.sls): + +``` +{% set supersecret_ssh_port = range(23, 600) | random %} + +check_sshd_config: + file.managed: + - name: /etc/ssh/sshd_config + +ssh_port: + cmd.run: + - name: 'sed -i -r "s/^[#P]+ort [0-9][0-9]*/Port {{ supersecret_ssh_port }}/" /etc/ssh/sshd_config' + - require: + - file: check_sshd_config + +sshd_restart: + service.running: + - name: ssh.service # Yes, this is the daemon process + - watch: + - cmd: ssh_port + +ssh_new_port_inform: + cmd.run: + - name: 'echo "new SSH daemon port for $(hostname) is {{ supersecret_ssh_port }}"' + - require: + - service: sshd_restart + - cmd: ssh_port + +``` + +Ajetaan ssh_random -state masterilta kaikille yhteydessä oleville minioneille: + +``` +sudo salt '*' state.apply ssh_random +``` + +Masterilla saatu output minionille "orjakone": + +``` +orjakone: +---------- + ID: check_sshd_config + Function: file.managed + Name: /etc/ssh/sshd_config + Result: True + Comment: File /etc/ssh/sshd_config exists with proper permissions. No changes made. + Started: 23:11:06.410285 + Duration: 4.806 ms + Changes: +---------- + ID: ssh_port + Function: cmd.run + Name: sed -i -r "s/^[#P]+ort [0-9][0-9]*/Port 240/" /etc/ssh/sshd_config + Result: True + Comment: Command "sed -i -r "s/^[#P]+ort [0-9][0-9]*/Port 240/" /etc/ssh/sshd_config" run + Started: 23:11:06.415594 + Duration: 4.329 ms + Changes: + ---------- + pid: + 3939 + retcode: + 0 + stderr: + stdout: +---------- + ID: sshd_restart + Function: service.running + Name: ssh.service + Result: True + Comment: Started Service ssh.service + Started: 23:11:06.861530 + Duration: 58.559 ms + Changes: + ---------- + ssh.service: + True +---------- + ID: ssh_new_port_inform + Function: cmd.run + Name: echo "new SSH daemon port for $(hostname) is 240" + Result: True + Comment: Command "echo "new SSH daemon port for $(hostname) is 240"" run + Started: 23:11:06.920584 + Duration: 62.236 ms + Changes: + ---------- + pid: + 3954 + retcode: + 0 + stderr: + stdout: + new SSH daemon port for minion is 240 + +Summary for orjakone +------------ +Succeeded: 4 (changed=3) +Failed: 0 +------------ +Total states run: 4 +Total run time: 129.930 ms +``` + +Näyttäisi siltä, että portti 240 on generoitu uudeksi SSH daemonin yhteysportiksi koneelle 'orjakone'. Varmistetaan tietojen oikeellisuus. Tämän voi tehdä etänä SSH-yhteyden avulla muultakin koneelta (testataan yhteyden toimivuus orjakoneen IP:een SSH clientilla porttia 240 käyttäen), +mutta tässä varmistamme SSH-yhteyden toimivuuden portissa 240 suoraan minionin näkymästä: + +/etc/ssh/sshd_config -tiedoston sisältöä SSH-client testauksineen orjakoneen näkymästä ylläolevan ajon jälkeen: + +![randomport-from-master](https://raw.githubusercontent.com/Fincer-altego/central-management-of-multiple-servers/master/images/ssh_randomport_for_minion.png)