# Patching Notes for the CaaSP Environment

[Day 1](#Day-1)

[Day 2](#Day-2)

[Patch/Upgrade Jenkins Container](#Patching-or-Upgrading-the-Jenkins-Container)

## Timeline
* When test or production (Commercial or Govcloud) is patched

## Patching Process

There isn't typically a need to inform anyone of patching as CaaSP is not considered "production" right now.

## Detailed Steps

### Day 1
#### Step 1: Victim Instances

Connect to the `CaaSP Salt Master` and run the following commands:

```
### There is also the grain 'role:caasp-victim' that can be used instead of 'vic-*' or 'vic-* or VIC-*'.

### Linux Victims
sudo -i
salt -C 'vic-* and G@kernel:Linux' test.ping --out=txt
salt -C 'vic-* and G@kernel:Linux' cmd.run 'df -h | egrep "[890][0-9]\%"'

# Review packages that will be updated (RHEL family only).
salt -C 'vic-* and G@os_family:RedHat' cmd.run 'yum check-update' 

# Upgrade packages
salt -C 'vic-* and G@kernel:Linux' pkg.upgrade


### Windows Victims
# Check for full disk(s). Anything under 95% is ok. The victims can have very full hard drives. 
salt -G 'os:Windows' status.diskusage --out=txt

#### Upgrade only the packages installed by chocolatey. This does NOT patch the operating system.
#### A failure here may be noted but is not a show stopper.
salt -G 'os:Windows' chocolatey.upgrade all

#### (OPTIONAL) Apply Windows OS updates/patches (it may take quite some time)
salt -t 60 -G 'os:Windows' win_wua.list summary=True skip_installed=True install=True
```

#### Step 2 (Day 1): Splunk, Kali, Bastion, etc. Instances

> :warning: This may upgrade Salt!

NOTE: Upgrading Docker will stop or restart the Jenkins and Phoenix containers.

```
salt -C 'not ( vic-* or VIC-* )' test.ping --out=txt
salt -C 'not ( vic-* or VIC-* )' cmd.run 'df -h | egrep "[890][0-9]\%"'

# Review packages that will be updated for RedHat family OSs.
salt -C 'not ( vic-* or VIC-* ) and ( G@os_family:RedHat )' cmd.run 'yum check-update' 

# Upgrade packages
salt -C 'not ( vic-* or VIC-* )' pkg.upgrade
```

#### Step 3 (Day 1): Post Patching

Ensure the Docker container for Jenkins is still running:
- [Jenkins Dashboard](https://build.caasp.accenturefederalcyber.com/)
- OR `ssh` to `caasp-build-01` and run `sudo -u docker docker container ls`

If it is not running, `ssh` to `caasp-build-01` and run:

```
sudo -iu docker
cd jenkins_docker/
../bin/docker-compose up -d
```

Ensure the Phoenix container for Jenkins is still running:
- [Phoenix Dashboard](https://phoenix.caasp.accenturefederalcyber.com/)

#### Step 4 (Day 1): Reboot Victims 

Post to Slack [#xdr-patching](https://afscyber.slack.com/archives/CJ462RRBM):
```
 Rebooting CaaSP victims now.
```

```
salt -C 'vic-* or VIC-* or G@role:caasp-victim' test.ping --out=txt
salt -C '( vic-* or VIC-* ) and G@kernel:Linux' system.reboot
salt -C '( vic-* or VIC-* ) and G@os:Windows' system.reboot timeout=30 in_seconds=True

#### This may take a long time--especially for the Windows victims

#### Keep waiting ...
watch "salt -C 'vic-* or VIC-*' test.ping --out=txt"

#### Check uptime. Look for values/seconds less than 1,000.
salt -C 'vic-* or VIC-*' status.uptime --out=txt
```

### Day 2
#### Step 1: Reboot Splunk Instances

Post to Slack [#xdr-patching Channel](https://afscyber.slack.com/archives/CJ462RRBM):
```
 Rebooting CaaSP Splunk now.
```

```
# Reboot the dev search head, hf, and cm
salt -L 'caasp-splunk-sh-dev,caasp-splunk-hf,caasp-splunk-cm' system.reboot

# Wait for them ...
watch "salt -L 'caasp-splunk-sh-dev,caasp-splunk-hf,caasp-splunk-cm' status.uptime --out=txt"

# Reboot the search head
salt caasp-splunk-sh system.reboot
# Wait for it ...
watch "salt caasp-splunk-sh status.uptime --out=txt"

# Reboot one indexer at a time (ping optional)
salt caasp-splunk-idx-i-0b66b9 test.ping --out=txt
date; salt caasp-splunk-idx-i-0b66b9 system.reboot

# Indexers take a while to restart
watch "salt caasp-splunk-idx-i-0b66b9 status.uptime --out=txt"
```

#### Wait for the Splunk indexing cluster to have four green checkmarks

Log in to the CaaSP Splunk platforms below and go to `Settings->Indexer clustering`:
   * CaaSP Splunk [Here](https://splunk.caasp.accenturefederalcyber.com) or 
   * CaaSP Search Head Dev [CaaSP Sh-dev](https://sh-dev.caasp.accenturefederalcyber.com) 

You can also go to the Cluster Master but you must [create an SSH tunnel](https://github.xdr.accenturefederalcyber.com/content-delivery/afs_cyber_range_infrastructure/wiki/SSH-Tunneling) to do so.

Repeat the above patching steps for the additional indexers, waiting for `four` green checks in between each one.

```
# Do the second indexer
salt caasp-splunk-idx-i-0babc3 test.ping --out=txt
date; salt caasp-splunk-idx-i-0babc3 system.reboot

# Indexers take a while to restart
watch "salt caasp-splunk-idx-i-0babc3 status.uptime --out=txt"
```

#### Wait for the Splunk cluster to have four green checkmarks

```
# Do the third indexer
salt caasp-splunk-idx-i-04665e test.ping --out=txt
date; salt caasp-splunk-idx-i-04665e system.reboot

# Indexers take a while to restart
watch "salt caasp-splunk-idx-i-04665e status.uptime --out=txt"

# Verify all indexers rebooted (check for seconds less than a few thousand):
salt 'caasp-splunk-idx-i-*' status.uptime --out=txt
```

#### Ensure all Splunk instances have been rebooted

```
salt 'caasp-splunk-*' status.uptime --out=txt
```

#### Step 2 (Day 2): Reboot Kali, Jenkins, the Bastion, OSCDNS, Phoenix, and Salt Master

Post to Slack [#xdr-patching](https://afscyber.slack.com/archives/CJ462RRBM):
```
Rebooting CaaSP support infrastructure (Jenkins, Phoenix, etc.) now.
```

```
salt -L 'caasp-kali,caasp-build-01,caasp-bastion,caasp-oscdns,caasp-phoenix-01,caasp-salt-master' test.ping --out=txt
salt -L 'caasp-kali,caasp-build-01,caasp-bastion,caasp-oscdns,caasp-phoenix-01,caasp-salt-master' system.reboot

#### Rebooting will disconnect you from the Salt Master. Once you are able to ssh back in ...
salt -L 'caasp-kali,caasp-build-01,caasp-bastion,caasp-oscdns,caasp-phoenix-01,caasp-salt-master' status.uptime --out=txt
```

## Patching or Upgrading the Jenkins Container


The CaaSP Jenkins container uses the `jenkins/jenkins-lts` image published on Docker Hub. When you log in to Jenkins and see that there's a new LTS release, it is recommended to upgrade the container. The way to see if a new update is available is to look at the notifications bell in the upper right hand part of the screen. The notification will state, `"New version of Jenkins (2.277.1) is available for download."`

If needed, post to Slack to notify of the Jenkins Upgrade in the [#xdr-patching](https://afscyber.slack.com/archives/CJ462RRBM) channel:
```
Rebooting CaaSP Jenkins for updates. 
```

SSH to `caasp-build-01`.

The process is as follows:
* Stop the container
* Pull down the updated image
* Start the container

```
sudo -iu docker
cd jenkins_docker/
../bin/docker-compose down
../bin/docker-compose pull
../bin/docker-compose up -d
```

Use `docker logs -f jenkins` to watch the container's logs for `INFO    hudson.WebAppMain$3#run: Jenkins is fully up and running`.
