This article describes how to create a BASH script for continuous monitoring via an SSH connection for a specific time and an unknown amount of data that will be provided.
FortiManager, FortiAnalyzer and FortiGate
The following must be installed on the Linux/GNU platform:
openssh-client
ssh-keygen (optional, better security and fluency)
ssh-pass (when the ssh-keygen can not be used)
crontab
This article will demonstrate how to create a script that can be used for different purposes such as:
Two users will be used in this example:
Under the localuser, the 'ssh-keygen' will create a private and public key for the user, which will be in .ssh/id_ed25519(.pub) by default. The public key will be copied and pasted later in to the FortAnalyzer administrator profile.
Use the following command to open the default public key:
cat ~/.ssh/.ssh/id_ed25519.pub
This script relies on SSH multiplexing to achieve its goals.
SSH multiplexing is a feature that keeps persistent a single SSH session for specific time.
All of the settings can be reviewed from the man pages (man 5 ssh_config):
Host fazy
HostName faz.example.com
ControlPath ~/.ssh/controlmasters/%C
ControlMaster auto
ControlPersist 10m
Compression yes
RequestTTY force
If the debug will take 5 minutes, specifying 10m under ControlPersist is recommended. Additionally, consider how often the script will be started.
Host: Name for the current configuration.
HostName: IP/FQDN also 'Tokens'.
ControlPath: The path to the control socket (mkdir ~/.ssh/controlmasters/ to create it if there is not yet created one).
ControlMaster: Auto means to create a new session if there is not an existing one.
ControlPersist: Define a specific time to keep an already created connection in the background. Yes for persistent connection without specific limits.
RequestTTY: Yes is the equivalent of -t and -T of the ssh.
Connect to the FortiAnalyzer.
After copying the public key of localuser under the settings related to remoteuser under FortiAnalyzer, the next login will not require a password.
FortiAnalyzer administrator settings:
config system admin username
edit remoteuser
set ssh-public-key1 “ssh-ed25519 AAAA….” <- Up to 3 keys per username.
end
Example of the BASH script:
#!/bin/bash
# Author: vraev
# Source: https://community.fortinet.com
remotecommands="remotecommands.txt"
#the name of the file which will contain all required commands
USERNAME=('remoteuser')
HOSTS=('fazy')
# For more hosts use the example: HOSTS=('faz.example.com' ‘12.12.12.1’)
SSHDATE=$(date +"%Y%m%dT%H%M")
NLINES=('1,6 p' '8,10 p')
NTIME=('600' '1')
function sanit()
{
sed 's/^[ \t]*//;s/[ \t]*$//' | tr -s '[:space:]'
}
function remote()
{
ssh -tt ${USERNAME}@${1}
}
# This “remote” function is related with the SSH keygen when is in use.
#function remote()
# {
# SSHPASS='PassWord' sshpass -e ssh -tt remoteuser@faz.example.com
# }
# When the user is restricted, SSHPass is the other option to have this script working.
function retrieve()
{
for i in "${!NLINES[@]}"; do
for HOSTNAME in "${HOSTS[@]}"
do
remote ${HOSTNAME} < <(sed -n "${NLINES[i]}" ${remotecommands} | sanit ) >> ${HOSTNAME}_${SSHDATE}.log &
sleep ${NTIME[i]} && kill %%
done
done
exit 1
}
#cd ~/ssh_test/
retrieve
The example below provides the way to set up NLINES and NTIME.
Note: The last entry in the NTIME array is 1.
For instructions on how to schedule with crontab, see Technical Tip: Continuous Debug Monitoring with Bash and Crontab. More options regarding file security and additional troubleshooting steps can also be found in this aritcle.
Troubleshooting:
root@DebTestFr:~# gpg -d -q .hidenpass.gpg | sshpass ssh remoteuser@10.5.17.152
A pseudo-terminal will not be allocated because stdin is not a terminal.
This error can be mitigated by adding -tt options under the ssh client.
If read-write access to the 'System Settings' is not allowed in the administrator profile for the remoteuser, the following error will be observed:
FAZ_742 $ get sys stat
No permission to 'get system.status'
Note: Command parameters are case sensitive. Quotes are always used around the parameters like in this example: 'my_Account'.
Related articles:
The Fortinet Security Fabric brings together the concepts of convergence and consolidation to provide comprehensive cybersecurity protection for all users, devices, and applications and across all network edges.
Copyright 2024 Fortinet, Inc. All Rights Reserved.