inital commit
This commit is contained in:
14
Agent/ShellHubAgent.service
Normal file
14
Agent/ShellHubAgent.service
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=ShellHub Agent
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
Environment=SHELLHUB_PRIVATE_KEY=/opt/ShellHubAgent/shellhub.key
|
||||||
|
Environment=SHELLHUB_TENANT_ID=SERVER_TENID
|
||||||
|
Environment=SHELLHUB_SERVER_ADDRESS=SERVER_ADDR
|
||||||
|
Environment=SHELLHUB_KEEPALIVE_INTERVAL=300
|
||||||
|
ExecStart=/opt/ShellHubAgent/ShellHubAgent
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
17
Agent/installAgent.sh
Normal file
17
Agent/installAgent.sh
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
##Build of a release tag
|
||||||
|
RelVer=stable
|
||||||
|
##Build of a master branch, but config is vaidated
|
||||||
|
#RelVer=latest_Tested
|
||||||
|
##Build of a master branch
|
||||||
|
#RelVer=latest
|
||||||
|
|
||||||
|
SERVER_ADDRESS=<unset>
|
||||||
|
TENANT_ID=<unset>
|
||||||
|
|
||||||
|
mkdir -p /opt/ShellHubAgent
|
||||||
|
wget https://git.bprieshof.nl/ci/Releases/ShellHub/"$RelVer"/BinAgent/ShellHubAgent-amd64 -O /opt/ShellHubAgent/ShellHubAgent
|
||||||
|
wget https://git.bprieshof.nl/Tools/ShellHubNative/raw/branch/master/Agent/ShellHubAgent.service -O /etc/systemd/system/ShellHubAgent.service
|
||||||
|
chmod +x /opt/ShellHub/ShellHubAgent
|
||||||
|
sed -i -e 's/SERVER_TENID/'$TENANT_ID'/g' -e 's/SERVER_ADDR/'$SERVER_ADDRESS'/g' /etc/systemd/system/ShellHubSSH.service
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable --now ShellHubAgent
|
||||||
3
Server-KickStart.sh
Normal file
3
Server-KickStart.sh
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
git clone https://git.bprieshof.nl/Tools/ShellHubNative
|
||||||
|
cd ShellHubNative/Server
|
||||||
|
bash install.sh
|
||||||
36
Server/Tools/adduser
Normal file
36
Server/Tools/adduser
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
[ $# -ne 3 ] && echo "Usage: $0 <username> <password> <email>" && exit 1
|
||||||
|
|
||||||
|
if [ ! -f "$(which uuidgen 2> /dev/null)" ]; then
|
||||||
|
echo "$0 requires uuidgen but it's not installed. Aborting!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${systemctl is-active --quiet mongod}" != "active" ]; then
|
||||||
|
echo "ERROR: mongoDB service is not running"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
USERNAME=$1
|
||||||
|
PASSWORD=`printf $2 | sha256sum | awk '{ print $1 }'`
|
||||||
|
EMAIL=$3
|
||||||
|
[ -z "$TENANT_ID" ] && TENANT_ID=`uuidgen`
|
||||||
|
|
||||||
|
|
||||||
|
EXISTS=$(mongo main --quiet --eval "db.users.find({ username: '$USERNAME' })")
|
||||||
|
|
||||||
|
if [ -n "$EXISTS" ]; then
|
||||||
|
echo "ERROR: user already exists!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
INSERTED=$(mongo main --quiet --eval "db.users.insert({ name: '$USERNAME', username: '$USERNAME', password: '$PASSWORD', email: '$EMAIL', tenant_id: '$TENANT_ID' }).nInserted")
|
||||||
|
|
||||||
|
if [ $INSERTED -eq 1 ]; then
|
||||||
|
echo "User added: $USERNAME"
|
||||||
|
echo "Tenant ID: $TENANT_ID"
|
||||||
|
else
|
||||||
|
echo "ERROR: Failed to add user"
|
||||||
|
fi
|
||||||
25
Server/Tools/del-user
Executable file
25
Server/Tools/del-user
Executable file
@@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
[ -z $1 ] && echo "Usage: $0 <username>" && exit 1
|
||||||
|
|
||||||
|
if [ "${systemctl is-active --quiet mongod}" != "active" ]; then
|
||||||
|
echo "ERROR: mongoDB service is not running"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
USERNAME=$1
|
||||||
|
|
||||||
|
EXISTS=$(mongo main --quiet --eval "db.users.find({ username: '$USERNAME' })")
|
||||||
|
|
||||||
|
if [ -z "$EXISTS" ]; then
|
||||||
|
echo "ERROR: user does not exists!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
REMOVED=`mongo main --quiet --eval "db.users.remove({username: '$USERNAME'}).nRemoved"`
|
||||||
|
|
||||||
|
if [ $REMOVED -gt 0 ]; then
|
||||||
|
echo "User deleted"
|
||||||
|
else
|
||||||
|
echo "ERROR: Failed to delete user"
|
||||||
|
fi
|
||||||
27
Server/Tools/reset-user-password
Executable file
27
Server/Tools/reset-user-password
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
[ -z $1 ] || [ -z $2 ] && echo "Usage: $0 <username> <password>" && exit 1
|
||||||
|
|
||||||
|
if [ "${systemctl is-active --quiet mongod}" != "active" ]; then
|
||||||
|
echo "ERROR: mongoDB service is not running"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
USERNAME=$1
|
||||||
|
PASSWORD=`printf $2 | sha256sum | awk '{ print $1 }'`
|
||||||
|
|
||||||
|
EXISTS=$(mongo main --quiet --eval "db.users.find({ username: '$USERNAME' })")
|
||||||
|
|
||||||
|
if [ -z "$EXISTS" ]; then
|
||||||
|
echo "ERROR: user does not exists!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
MODIFIED=` mongo main --quiet --eval "db.users.update({ username: '$USERNAME' }, { \\$set: { password: '$PASSWORD' } }).nModified"`
|
||||||
|
|
||||||
|
if [ $MODIFIED -eq 1 ]; then
|
||||||
|
echo "Password changed"
|
||||||
|
else
|
||||||
|
echo "User password not changed"
|
||||||
|
fi
|
||||||
13
Server/config/ServiceTemplates/ShellHubAPI.service
Normal file
13
Server/config/ServiceTemplates/ShellHubAPI.service
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Shellhub API
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
Environment=PRIVATE_KEY=/opt/ShellHub/keys/api_private_key
|
||||||
|
Environment=PUBLIC_KEY=/opt/ShellHub/keys/api_public_key
|
||||||
|
ExecStart=/opt/ShellHub/ShellHubAPI
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
14
Server/config/ServiceTemplates/ShellHubSSH.service
Normal file
14
Server/config/ServiceTemplates/ShellHubSSH.service
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Shellhub SSH
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
Environment=PRIVATE_KEY=/opt/ShellHub/keys/ssh_private_key
|
||||||
|
Environment=SHELLHUB_HOSTED=false
|
||||||
|
Environment=RECORD_URL=127.0.0.1:8080
|
||||||
|
ExecStart=/opt/ShellHub/ShellHubSSH
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
163
Server/config/openresty.conf
Normal file
163
Server/config/openresty.conf
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
user www-data;
|
||||||
|
worker_processes 1;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
error_log /var/log/nginx/error.log;
|
||||||
|
|
||||||
|
client_body_temp_path /var/run/openresty/nginx-client-body;
|
||||||
|
proxy_temp_path /var/run/openresty/nginx-proxy;
|
||||||
|
fastcgi_temp_path /var/run/openresty/nginx-fastcgi;
|
||||||
|
uwsgi_temp_path /var/run/openresty/nginx-uwsgi;
|
||||||
|
scgi_temp_path /var/run/openresty/nginx-scgi;
|
||||||
|
|
||||||
|
sendfile on;
|
||||||
|
|
||||||
|
keepalive_timeout 65;
|
||||||
|
|
||||||
|
map $http_x_real_ip $x_real_ip {
|
||||||
|
default $http_x_real_ip;
|
||||||
|
"" $remote_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
include /opt/ShellHub/nginx.var;
|
||||||
|
listen 80;
|
||||||
|
|
||||||
|
server_name _;
|
||||||
|
resolver 127.0.0.1 ipv6=off;
|
||||||
|
root /opt/ShellHub/ui;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
add_header Cache-Control "no-cache, no-store";
|
||||||
|
add_header Pragma "no-cache";
|
||||||
|
|
||||||
|
index index.html index.htm;
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api {
|
||||||
|
auth_request /auth;
|
||||||
|
auth_request_set $tenant_id $upstream_http_x_tenant_id;
|
||||||
|
auth_request_set $username $upstream_http_x_username;
|
||||||
|
error_page 500 =401 /auth;
|
||||||
|
rewrite ^/api/(.*)$ /api/$1 break;
|
||||||
|
proxy_set_header X-Tenant-ID $tenant_id;
|
||||||
|
proxy_set_header X-Username $username;
|
||||||
|
proxy_pass http://127.0.0.1:8080;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /ssh/connection {
|
||||||
|
auth_request /auth;
|
||||||
|
auth_request_set $device_uid $upstream_http_x_device_uid;
|
||||||
|
proxy_pass http://127.0.0.1:8081;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection 'upgrade';
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $x_real_ip;
|
||||||
|
proxy_set_header X-Device-UID $device_uid;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_cache_bypass $http_upgrade;
|
||||||
|
proxy_redirect off;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /ssh/revdial {
|
||||||
|
proxy_pass http://127.0.0.1:8081;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection 'upgrade';
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $x_real_ip;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_cache_bypass $http_upgrade;
|
||||||
|
proxy_redirect off;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /ssh/auth {
|
||||||
|
auth_request /auth;
|
||||||
|
auth_request_set $device_uid $upstream_http_x_device_uid;
|
||||||
|
error_page 500 =401 /auth;
|
||||||
|
proxy_pass http://127.0.0.1:8080;
|
||||||
|
proxy_set_header X-Device-UID $device_uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~* /api/sessions/(.*)/close {
|
||||||
|
auth_request /auth;
|
||||||
|
auth_request_set $tenant_id $upstream_http_x_tenant_id;
|
||||||
|
error_page 500 =401 /auth;
|
||||||
|
rewrite ^/api/(.*)$ /$1 break;
|
||||||
|
proxy_set_header X-Tenant-ID $tenant_id;
|
||||||
|
proxy_pass http://127.0.0.1:8081;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api/devices/auth {
|
||||||
|
auth_request off;
|
||||||
|
rewrite ^/api/(.*)$ /api/$1 break;
|
||||||
|
proxy_pass http://127.0.0.1:8080;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api/login {
|
||||||
|
auth_request off;
|
||||||
|
rewrite ^/api/(.*)$ /api/$1 break;
|
||||||
|
proxy_pass http://127.0.0.1:8080;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /auth {
|
||||||
|
internal;
|
||||||
|
rewrite ^/(.*)$ /internal/$1 break;
|
||||||
|
proxy_pass http://127.0.0.1:8080;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /ws {
|
||||||
|
proxy_pass http://ssh:8081;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection 'upgrade';
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
|
||||||
|
proxy_set_header X-Real-IP $x_real_ip;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_cache_bypass $http_upgrade;
|
||||||
|
proxy_redirect off;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /info {
|
||||||
|
default_type application/json;
|
||||||
|
|
||||||
|
content_by_lua_block {
|
||||||
|
local host=ngx.var.http_host
|
||||||
|
local ssh_port=ngx.var.SHELLHUB_SSH_PORT
|
||||||
|
local version=ngx.var.SHELLHUB_VERSION
|
||||||
|
local json = require('cjson')
|
||||||
|
local data = {version=version, endpoints={api=host, ssh=host .. ":" .. ssh_port}}
|
||||||
|
ngx.say(json.encode(data))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
location ~ ^/(install.sh|kickstart.sh)$ {
|
||||||
|
default_type "text/x-shellscript";
|
||||||
|
index nonexistingindex.htm;
|
||||||
|
content_by_lua_block {
|
||||||
|
local host=ngx.var.http_host
|
||||||
|
local scheme = ngx.var.http_x_forwarded_proto ~= '' and ngx.var.http_x_forwarded_proto or ngx.var.scheme
|
||||||
|
local tenant_id=ngx.var.arg_tenant_id
|
||||||
|
local keepalive_interval=ngx.var.arg_keepalive_interval
|
||||||
|
local preferred_hostname=ngx.var.arg_preferred_hostname
|
||||||
|
local version=ngx.var.SHELLHUB_VERSION
|
||||||
|
local template = require "resty.template"
|
||||||
|
template.render("kickstart.sh", {
|
||||||
|
scheme = scheme,
|
||||||
|
host = host,
|
||||||
|
tenant_id = tenant_id,
|
||||||
|
keepalive_interval = keepalive_interval,
|
||||||
|
preferred_hostname = preferred_hostname,
|
||||||
|
version = version
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
53
Server/install.sh
Normal file
53
Server/install.sh
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
##Build of a release tag
|
||||||
|
RelVer=stable
|
||||||
|
##Build of a master branch, but config is vaidated
|
||||||
|
#RelVer=latest_Tested
|
||||||
|
##Build of a master branch
|
||||||
|
#RelVer=latest
|
||||||
|
|
||||||
|
#Go to script directory
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
#Setting up services needed for ShellHub
|
||||||
|
##PreReqs
|
||||||
|
apt-get -y install --no-install-recommends wget gnupg ca-certificates openssl uuid-runtime
|
||||||
|
###add openresty Repo
|
||||||
|
wget -O - https://openresty.org/package/pubkey.gpg | apt-key add -
|
||||||
|
echo "deb http://openresty.org/package/$(grep --color=never -Po "^ID=\K.*" "/etc/os-release") $(grep -oP '(?<=^VERSION_CODENAME=).+' /etc/os-release | tr -d '"') openresty" > /etc/apt/sources.list.d/openresty.list
|
||||||
|
###add mongoDB Repo
|
||||||
|
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add -
|
||||||
|
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/$(grep --color=never -Po "^ID=\K.*" "/etc/os-release") $(grep -oP '(?<=^VERSION_CODENAME=).+' /etc/os-release | tr -d '"')/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
|
||||||
|
##Installing packages
|
||||||
|
apt-get update
|
||||||
|
apt install -y openresty mongodb-org
|
||||||
|
##Configuring external services
|
||||||
|
opm get bungle/lua-resty-template
|
||||||
|
systemctl stop openresty mongod
|
||||||
|
systemctl enable openresty mongod
|
||||||
|
# config openresty(nginx)
|
||||||
|
rm /etc/openresty/nginx.conf
|
||||||
|
wget https://git.bprieshof.nl/ci/Releases/ShellHub/"$RelVer"/nginx.env -O /opt/ShellHub/nginx.env
|
||||||
|
mv config/openresty.conf /etc/openresty/nginx.conf
|
||||||
|
echo " 127.0.0.1 ui api ssh mongo" > /etc/hosts
|
||||||
|
systemctl start openresty mongod
|
||||||
|
|
||||||
|
##Setup Binaries
|
||||||
|
mkdir -p /opt/ShellHub/{ui,keys,tools}
|
||||||
|
wget https://git.bprieshof.nl/ci/Releases/ShellHub/"$RelVer"/.env -O /opt/ShellHub/shellhub.env
|
||||||
|
wget https://git.bprieshof.nl/ci/Releases/ShellHub/"$RelVer"/BinServices/ShellHubSSH-amd64 -O /opt/ShellHub/ShellHubSSH
|
||||||
|
wget https://git.bprieshof.nl/ci/Releases/ShellHub/"$RelVer"/BinServices/ShellHubAPI-amd64 -O /opt/ShellHub/ShellHubAPI
|
||||||
|
wget https://git.bprieshof.nl/ci/Releases/ShellHub/"$RelVer"/BinServices/webui.tar.gz -O /tmp/webui.tar.gz
|
||||||
|
chmod +x /opt/ShellHub/BinServices/ShellHubAPI
|
||||||
|
chmod +x /opt/ShellHub/BinServices/ShellHubSSH
|
||||||
|
tar -zxvf /tmp/webui.tar.gz -C /opt/ShellHub/ui
|
||||||
|
mv Tools /opt/ShellHub/tools
|
||||||
|
|
||||||
|
##Generating keys
|
||||||
|
openssl genrsa -out /opt/ShellHub/keys/api_private_key 2048
|
||||||
|
openssl rsa -in /opt/ShellHub/keys/api_private_key -out /opt/ShellHub/keys/api_public_key -pubout
|
||||||
|
openssl genrsa -out /opt/ShellHub/keys/ssh_private_key 2048
|
||||||
|
|
||||||
|
##Setup services
|
||||||
|
mv config/ServiceTemplates/ShellHubAPI.service /etc/systemd/system/ShellHubAPI.service
|
||||||
|
mv config/ServiceTemplates/ShellHubSSH.service /etc/systemd/system/ShellHubSSH.service
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable --now ShellHubAPI ShellHubSSH
|
||||||
Reference in New Issue
Block a user