Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
How to contribute to CISO Assistant internationalization


ServiceNow Integration Guide








(function executeRule(current, previous) {
try {
// Initialize REST Message ('API Name', 'Method Name')
// REPLACE 'CISO_Assistant_Sync' with your actual API Name if different!
var r = new sn_ws.RESTMessageV2('CISO_Assistant_Sync', 'POST_Event');
// Determine Event Type
var eventType = 'sn_update';
if (current.operation() == 'insert') {
eventType = 'sn_create';
} else if (current.operation() == 'delete') {
eventType = 'sn_delete';
}
// Build Payload (Mapping raw database values)
var payload = {
"event": eventType,
"sys_id": current.getValue("sys_id"),
"number": current.getValue("number"),
"short_description": current.getValue("short_description"),
"description": current.getValue("description"),
"state": current.getValue("state"),
"priority": current.getValue("priority"),
"due_date": current.getValue("due_date"),
"sys_updated_on": current.getValue("sys_updated_on")
};
// Send Request
r.setRequestBody(JSON.stringify(payload));
var response = r.execute();
// Log Errors
var httpStatus = response.getStatusCode();
if (httpStatus < 200 || httpStatus >= 300) {
gs.error("CISO Sync Failed: " + httpStatus + " " + response.getBody());
}
} catch (ex) {
gs.error("CISO Sync Error: " + ex.message);
}
})(current, previous);


Small tutorial to learn how to create your first compliance assessment
Small tutorial to learn how to create your first perimeter and be prepared for risk and compliance assessment
Small tutorial to learn how to create your first compliance assessment





Guidelines on data import format
Main concepts of the mapping feature


Productivity tips series
Establishing a security posture in flashcards mode
How to delete/remove a loaded library
Through implementation groups













Configure Okta as an Identity Provider for CISO Assistant
Configure Google Workspace as an Identity Provider for CISO Assistant
Configure Keycloak as an Identity Provider for CISO Assistant















































Deep dive into CISO Asisstant IAM model
For fine-grained permissions management - PRO feature





















Minor nonconformity, Major nonconformity, etc.



#update ubuntu repository and OS
sudo apt update
sudo apt upgrade
# install docker
sudo snap install docker
#install python
sudo apt install python3-pip python3.12-venv
#clone the repo
git clone https://github.com/intuitem/ciso-assistant-community.git
#go to the config generator
cd ciso-assistant-community
cd config
# setting up the python project and dependencies
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# run the interactive config generator
python make_config.py# switch to sudo. This can be avoided depending on your docker setup
sudo su
./docker-compose.shcd config
# stop and remove containers
docker compose -f docker-compose-custom.yml rm -fs
# delete the db and proxy config
git clean -fdx .How to add custom certificates for your remote installation
importing CIS Controls or CSA CCM




backend (or huey):
...
volumes:
...
- /your/ca-certificate/path/example_CA.crt:/usr/local/share/ca-certificates/root_CA.crt:rocaddy:
container_name: caddy
image: caddy:2.10.0
...
volumes:
- ./caddy_data:/data
command: |
sh -c 'echo $$CISO_ASSISTANT_URL "{
reverse_proxy /api/* backend:8000
reverse_proxy /* frontend:3000
tls /data/<path>/cert_file /data/<path>/key_file
}" > Caddyfile && caddy run'chcon -Rt svirt_sandbox_file_t ./dbexport USE_S3=True
export AWS_ACCESS_KEY_ID=<your-access-key>
export AWS_SECRET_ACCESS_KEY=<your-secret-key>
export AWS_STORAGE_BUCKET_NAME=<your-bucket-name>
export AWS_S3_ENDPOINT_URL=<your-s3-endpoint>docker run -d \
--name minio \
-p 9000:9000 \
-p 9001:9001 \
-e MINIO_ROOT_USER=ciso-assistant-admin \
-e MINIO_ROOT_PASSWORD=not_secure_password \
-v minio_data:/data \
minio/minio server /data --console-address ":9001"export USE_S3=True
export AWS_ACCESS_KEY_ID=ciso-assistant-admin
export AWS_SECRET_ACCESS_KEY=not_secure_password
export AWS_STORAGE_BUCKET_NAME=my-ciso-bucket
export AWS_S3_ENDPOINT_URL=http://localhost:9000#update ubuntu repository and OS
sudo apt update
sudo apt upgrade
# install docker
sudo snap install docker
#install python
sudo apt install python3-pip python3.12-venv
#clone the repo
git clone https://github.com/intuitem/ciso-assistant-community.git
#go to the config generator
cd ciso-assistant-community
cd config
# setting up the python project and dependencies
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# run the interactive config generator
python make_config.py./docker-compose.shdocker compose logs backenddocker compose exec backend poetry run python manage.py migratedocker compose up -ddocker compose exec backend poetry run python manage.py createsuperuser# frontend/Dockerfile
ENV BODY_SIZE_LIMIT=20000000 backend:
...
entrypoint:
- /bin/sh
- -c
- |
update-ca-certificates
poetry run bash ./startup.shhuey:
...
entrypoint:
- /bin/sh
- -c
- |
update-ca-certificates
poetry run python manage.py run_huey -w 2 --scheduler-interval 60caddy:
container_name: caddy
image: caddy:2.10.0
...
volumes:
- ./caddy_data:/data
- ./certs:/certs
command: |
sh -c 'echo $$CISO_ASSISTANT_URL "{
reverse_proxy /api/* backend:8000
reverse_proxy /* frontend:3000
tls /certs/cert_file /certs/key_file
}" > Caddyfile && caddy run'./docker-compose.sh./docker-compose-build.sh./update-ciso-assistant.shdocker rmi ghcr.io/intuitem/ciso-assistant-community/backend:latest ghcr.io/intuitem/ciso-assistant-community/frontend:latest 2> /dev/nullv1v1v2Switch the UI language
getting the incremental updates of your framework, matrix or catalog




CRQ quick start
helm show values oci://ghcr.io/intuitem/helm-charts/ce/ciso-assistant > custom.yaml
Integrate CISO Assistant with third-party providers
helm install ciso-assistant-release oci://ghcr.io/intuitem/helm-charts/ce/ciso-assistant -f custom.yaml





How to submit a framework, matrix or catalog to the community repository
Personal Access Token to interact with the API

















{
"type": "appliedcontrol.created",
"timestamp": "2025-11-13T14:35:06Z",
"data": {
"id": "53709ff2-ade7-4172-9dee-daa580cbba5b"
}
}{
"type": "appliedcontrol.created",
"timestamp": "2025-11-13T14:35:06Z",
"data": {
"id": "53709ff2-ade7-4172-9dee-daa580cbba5b",
"name": "MFA Enforcement",
"status": "active",
"owner": "john.doe@example.com",
...
}
}import hmac
import hashlib
import base64
import time
def verify_webhook(request, secret):
# 1. Get Headers
msg_id = request.headers.get("webhook-id")
msg_timestamp = request.headers.get("webhook-timestamp")
signature_header = request.headers.get("webhook-signature")
if not (msg_id and msg_timestamp and signature_header):
raise ValueError("Missing webhook headers")
# 2. Verify Timestamp (Replay Protection)
# Reject if older than 5 minutes
now = int(time.time())
if now - int(msg_timestamp) > 300:
raise ValueError("Message timestamp too old")
# 3. Construct Signed Content
# IMPORTANT: Use the raw bytes of the request body
body = request.body.decode("utf-8")
to_sign = f"{msg_id}.{msg_timestamp}.{body}"
# 4. Calculate Expected Signature
# The header format is "v1,signature_hash"
# We only support v1 (HMAC-SHA256) for now
secret_bytes = secret.encode("utf-8")
to_sign_bytes = to_sign.encode("utf-8")
digest = hmac.new(secret_bytes, to_sign_bytes, hashlib.sha256).digest()
calculated_signature = base64.b64encode(digest).decode()
# 5. Compare Securely
# Extract the hash from "v1,..."
provided_signature = signature_header.split(",")[1]
if not hmac.compare_digest(calculated_signature, provided_signature):
raise ValueError("Invalid signature")
return Trueexport DJANGO_DEBUG=Truepython3 manage.py runservercurl --request GET \
--url http://127.0.0.1:8000/api/assets/ \
--header 'authorization: Token a6a120f....'asset.deleted


# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"git clone https://github.com/intuitem/ciso-assistant-community.git
cd ciso-assistant-community/clicd /path/to/ciso-assistant-community/clicp .mcp.env.example .mcp.env# Your Personal Access Token from Step 1
TOKEN=your-token-here
# Your CISO Assistant API URL
API_URL=http://localhost:8000/api
# Set to "true" if using HTTPS with a valid certificate
# Set to "false" for local development or self-signed certs
VERIFY_CERTIFICATE=false{
"mcpServers": {
"ciso-assistant": {
"command": "uv",
"args": [
"--directory",
"/path/to/ciso-assistant-community/cli",
"run",
"ca_mcp.py"
]
}
}
}{
"mcpServers": {
"ciso-assistant": {
"command": "uv",
"args": [
"--directory",
"/Users/yourname/ciso-assistant-community/cli",
"run",
"ca_mcp.py"
]
}
}
}{
"mcpServers": {
"ciso-assistant": {
"command": "uv",
"args": [
"--directory",
"C:\\Users\\yourname\\ciso-assistant-community\\cli",
"run",
"ca_mcp.py"
]
}
}
}{
"mcpServers": {
"ciso-assistant": {
"command": "uv",
"args": [
"--directory",
"/home/yourname/ciso-assistant-community/cli",
"run",
"ca_mcp.py"
]
}
}
}{
"mcpServers": {
"ciso-assistant": {
"command": "uv",
"args": [
"--directory",
"/path/to/ciso-assistant-community/cli",
"run",
"ca_mcp.py"
],
"env": {
"TOKEN": "your-token-here",
"API_URL": "http://localhost:8000/api",
"VERIFY_CERTIFICATE": "false"
}
}
}
}{
"mcpServers": {
"ciso-assistant": {
"command": "uv",
"args": [
"--directory",
"/path/to/ciso-assistant-community/cli",
"run",
"ca_mcp.py"
]
}
}
}{
"mcpServers": {
"ciso-assistant": {
"command": "/Users/yourname/.cargo/bin/uv",
"args": [
"--directory",
"/path/to/ciso-assistant-community/cli",
"run",
"ca_mcp.py"
]
}
}
}which uv # macOS/Linux
where uv # Windows{
"mcpServers": {
"ciso-assistant": {
"command": "/path/to/uv",
"args": [
"--directory",
"/path/to/ciso-assistant-community/cli",
"run",
"ca_mcp.py"
],
"env": {
"TOKEN": "your-personal-access-token",
"VERIFY_CERTIFICATE": "false",
"API_URL": "http://localhost:8000/api"
}
}
}
}{
"mcpServers": {
"ciso-assistant": {
"command": "/Users/yourname/.cargo/bin/uv",
"args": [
"--directory",
"/Users/yourname/ciso-assistant-community/cli",
"run",
"ca_mcp.py"
],
"env": {
"TOKEN": "your-personal-access-token",
"VERIFY_CERTIFICATE": "false",
"API_URL": "http://localhost:8000/api"
}
}
}
}cd /path/to/ciso-assistant-community/cli
uv run ca_mcp.py






















































































































































































