https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/SAP-BTP-Security-blog-posts.xmlSAP Community - SAP BTP Security2026-04-10T14:00:22.105129+00:00python-feedgenSAP BTP Security blog posts in SAP Communityhttps://community.sap.com/t5/technology-blog-posts-by-sap/beta-version-of-application-vulnerability-report-for-sap-btp-now-available/ba-p/14283839Beta Version of Application Vulnerability Report for SAP BTP Now Available2025-12-04T14:18:40.970000+01:00Fabian_Richterhttps://community.sap.com/t5/user/viewprofilepage/user-id/1859514<P><SPAN class="">Earlier this month, we released the application vulnerability report (beta) for SAP Business Technology Platform (SAP BTP). You can use this new service to detect and remediate open-source application vulnerabilities in your SAP BTP deployed applications.</SPAN><SPAN class=""> </SPAN></P><H2 id="toc-hId-1766469780"><STRONG><SPAN>What is this new service all about?</SPAN></STRONG><SPAN> </SPAN></H2><P><SPAN>Frequent security issues in open-source components endanger business data in customer deployed applications. Customers are responsible for performing vigilant patch and vulnerability management. By leveraging the new application vulnerability report for SAP BTP, open-source vulnerabilities in your Cloud Foundry applications can be detected and remediated. It's crucial to fix such vulnerabilities quickly, as attackers are usually aware of them and might try to break into vulnerable systems.</SPAN><SPAN> </SPAN></P><H2 id="toc-hId-1569956275"><STRONG><SPAN>What does the new application vulnerability report service offer you?</SPAN></STRONG><SPAN> </SPAN></H2><P><SPAN>The application vulnerability report supports you in the detection of vulnerabilities in custom applications during runtime. It enables you to act on criticality and other provided vulnerability details, like mitigation recommendations. </SPAN><SPAN> </SPAN></P><P><SPAN>If we take a closer look at the process, the service scans the applications using a proprietary scanning layer that utilizes open-source scanners as well as custom SAP BTP-specific and 0-day exploit targeted scanners. This unique combination offers a very broad and up-to-date coverage of vulnerabilities in your applications. By using an API, you can also integrate the report data into your incident and security workflow.</SPAN><SPAN> </SPAN></P><P><SPAN>Let’s have a quick look at the architecture overview:</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Fabian_Richter_0-1764845089098.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/348480iF8F3D2E11CE07ED0/image-size/medium?v=v2&px=400" role="button" title="Fabian_Richter_0-1764845089098.png" alt="Fabian_Richter_0-1764845089098.png" /></span></P><P class="lia-align-center" style="text-align: center;"><I><SPAN>Application Vulnerability Report for SAP BTP – Architecture Overview</SPAN></I><SPAN> </SPAN></P><H2 id="toc-hId-1373442770"><STRONG><SPAN>Get started now!</SPAN></STRONG><SPAN> </SPAN></H2><P><SPAN>You can find lots of useful information in this practical hands-on blog post:</SPAN><SPAN> </SPAN></P><P><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-application-vulnerability-report-for-cloudfoundry-applications/ba-p/14281684" target="_blank"><SPAN>Introducing Application Vulnerability Report for Cloud Foundry Applications – Try It Now!</SPAN></A><SPAN> </SPAN></P><P><SPAN>The complete documentation is available on </SPAN><A href="https://help.sap.com/docs/application-vulnerability-report?locale=en-US" target="_blank" rel="noopener noreferrer"><SPAN>SAP Help Portal</SPAN></A><SPAN>.</SPAN><SPAN> </SPAN></P><P><SPAN>Please note that this is a </SPAN><STRONG><SPAN>beta service</SPAN></STRONG><SPAN> available on SAP BTP for subaccounts in trial and enterprise accounts. It is currently available in the “cf-eu10” landscape. Once the beta phase is completed, we plan to roll out the service to other regions.</SPAN><SPAN> </SPAN></P><P><SPAN>If you are interested in what’s more to come, check out the road map in </SPAN><A href="https://roadmaps.sap.com/board?PRODUCT=73554900100800006073&range=CURRENT-LAST" target="_blank" rel="noopener noreferrer"><SPAN>SAP Road Map Explorer</SPAN></A><SPAN>.</SPAN><SPAN> </SPAN></P><P><SPAN>Try it out, and we look forward to your feedback!</SPAN><SPAN> </SPAN></P><P><SPAN> </SPAN></P><P><STRONG><SPAN>Also make sure to join our community to learn more about the security services and features in SAP Business Technology Platform here:</SPAN></STRONG><SPAN> </SPAN></P><P><A href="https://community.sap.com/topics/btp-security" target="_blank"><STRONG><SPAN>https://community.sap.com/topics/btp-security</SPAN></STRONG></A><SPAN> </SPAN></P>2025-12-04T14:18:40.970000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/automating-user-offboarding-in-sap-btp-across-multiple-subaccounts-with/ba-p/14298902Automating User Offboarding in SAP BTP Across Multiple Subaccounts with PowerShell & BTP CLI2026-01-01T05:43:28.335000+01:00shasankgupta024https://community.sap.com/t5/user/viewprofilepage/user-id/877731<P>Managing user offboarding in a complex SAP BTP (Business Technology Platform) landscape with multiple subaccounts can quickly become a time-consuming and error-prone process. Manually tracking and deleting users across all subaccounts and trusted identity providers (IDPs) increases the risk of missing accounts, leading to potential security gaps.</P><P>To address this challenge, I have <STRONG>developed a PowerShell script that automates the process of deleting users from all IDPs across all your BTP subaccounts</STRONG>, ensuring a secure and consistent offboarding process.</P><P>In this blog, I will walk you through the prerequisites, setup, and usage of the script, as well as the benefits it brings to your BTP user management.</P><P><FONT color="#0000FF"><STRONG>Why Automate User Deletions?</STRONG></FONT></P><P>SAP BTP tenants frequently use multiple subaccounts for different environments (dev/test/prod), business units, or regions. Each subaccount might rely on several identity providers (IDPs), making manual user cleanup a tedious and risky task. Automation ensures that:</P><UL><LI>No user is accidentally missed during the offboarding process.</LI><LI>Audit logs are maintained for all deletions, enhancing traceability.</LI><LI>The process is standardized and efficient, reducing manual interventions and errors.</LI></UL><P><FONT color="#0000FF"><STRONG>Prerequisites</STRONG></FONT></P><P>Before you begin, make sure you have the following:</P><OL><LI><U>SAP BTP CLI Installed</U><BR /> Download the SAP BTP CLI from [SAP Help Portal](<A href="https://help.sap.com/docs/btp/sap-business-technology-platform/download-and-start-using-btp-cli-client" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/btp/sap-business-technology-platform/download-and-start-using-btp-cli-client</A>). Unzip it into a directory of your choice, e.g., `C:\BTP`.</LI><LI><U>Subaccount Administrator Role</U><BR /> You need to have sufficient permissions to manage users and IDP configurations in the target BTP subaccounts. Make sure your user has the **Subaccount Administrator** role in BTP.</LI><LI><U>PowerShell (Windows OS)</U><BR /> The script is written for PowerShell and assumes you are running on a Windows machine.</LI><LI><U>User Email List</U><BR /> Prepare a text file named `useremails.txt` containing one email address per line for users you wish to offboard. Lines starting with `#` and empty lines are ignored by the script. Example:<BR /> abcd.ytr@sap.com<BR /> lmno.pqr@sap.com<BR /> xyza.bcde@sap.com<BR /> <span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shasankgupta24_bldr_2-1767020680708.png" style="width: 463px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/356583i5A6461F6E30990AC/image-dimensions/463x296?v=v2" width="463" height="296" role="button" title="shasankgupta24_bldr_2-1767020680708.png" alt="shasankgupta24_bldr_2-1767020680708.png" /></span><P> </P></LI></OL><P><FONT color="#0000FF"><STRONG>Folder Structure</STRONG></FONT></P><P>Place the following files in the C:\BTP directory. Alternatively, you can choose any location, as long as all the files listed below are stored together in the same folder.</P><P>`btp.exe` (SAP BTP CLI executable)<BR />`delete-user-from-all-idps-txt-input.ps1` (PowerShell script - see below)<BR />`useremails.txt` (Text file with user emails to be deleted)</P><P><STRONG><FONT color="#0000FF">Script Walkthrough</FONT></STRONG></P><P><U><EM>1. Logging Into BTP CLI</EM></U></P><P>First, you need to authenticate using the BTP CLI. Open a <STRONG>CMD window</STRONG> and enter:</P><OL class="lia-list-style-type-lower-alpha"><LI>cd C:\BTP</LI><LI>btp login </LI></OL><P>***When prompted, enter the CLI server URL as: <A href="https://cli.btp.cloud.sap" target="_blank" rel="noopener nofollow noreferrer">https://cli.btp.cloud.sap</A></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shasankgupta24_bldr_1-1767020611006.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/356582i032F96B6B7FCDCEC/image-size/large?v=v2&px=999" role="button" title="shasankgupta24_bldr_1-1767020611006.png" alt="shasankgupta24_bldr_1-1767020611006.png" /></span></P><P><EM><U>2. Executing the Deletion Script</U></EM></P><P>After logging in, Open Powershell Window and again change the folder to C:\BTP and run the PowerShell script with the following command:</P><P>.\delete-user-from-all-idps-txt-input.ps1 -UserEmailFile "useremails.txt"</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shasankgupta24_bldr_3-1767021128569.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/356647iCA3AAD87CFD7374E/image-size/large?v=v2&px=999" role="button" title="shasankgupta24_bldr_3-1767021128569.png" alt="shasankgupta24_bldr_3-1767021128569.png" /></span></P><P>On successful deletion </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shasankgupta24_bldr_6-1767021631983.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/356720i481693AF9A8D1D74/image-size/large?v=v2&px=999" role="button" title="shasankgupta24_bldr_6-1767021631983.png" alt="shasankgupta24_bldr_6-1767021631983.png" /></span></P><UL><LI> **What does the script do?**<UL><LI>Reads the list of user emails from your `useremails.txt` file.</LI><LI>Fetches all subaccounts your user has access to.<FONT color="#008000">—creates a file</FONT></LI><LI>For each subaccount:</LI><LI>Retrieves all trusted IDPs<FONT color="#008000">—creates a file</FONT></LI><LI>Attempts to delete each user email from every IDP (including `sap.default`, the default identity provider).</LI><LI>Logs the result (success or error) for every attempt.<FONT color="#008000">—creates a file</FONT></LI><LI>Generates a timestamped log file for traceability.</LI></UL></LI></UL><P> </P><P class="lia-indent-padding-left-120px" style="padding-left : 120px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shasankgupta24_bldr_5-1767021397308.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/356650iC734A64D30E9F373/image-size/medium?v=v2&px=400" role="button" title="shasankgupta24_bldr_5-1767021397308.png" alt="shasankgupta24_bldr_5-1767021397308.png" /></span></P><P><STRONG><U>3. Script Features</U></STRONG></P><UL><LI>Bulk User Deletion: Delete multiple users from all IDPs across all subaccounts in one go.</LI><LI>Automatic Audit Logging: Each run creates a log file in the `C:\BTP` folder (e.g., `user_deletion_log_20251229_153201.txt`) recording every deletion attempt, including timestamp, subaccount, IDP, user, and outcome.</LI><LI>Intelligent Parsing: The script skips commented and empty lines in your email input file and robustly parses the BTP CLI output.</LI><LI>Error Handling: If a user is not found or cannot be deleted, it's clearly logged with an error message.</LI></UL><P><STRONG><FONT color="#0000FF">Conclusion</FONT></STRONG></P><P>Automating user deletions with a PowerShell script and BTP CLI simplifies the offboarding process, reduces mistakes, and improves auditability in large BTP environments. Simply update your `useremails.txt` for each offboarding round, and in a matter of minutes, you can ensure all relevant user accounts are purged from every subaccount and IDP.</P><P>**Happy automating!**</P><P><FONT color="#008000"><U><EM>PowerShell Script Code as below :</EM></U></FONT></P><pre class="lia-code-sample language-php"><code>param (
[Parameter(Mandatory = $true)]
[string]$UserEmailFile
)
# --- CONFIGURE LOG FILE PATH HERE ---
$now = Get-Date -Format 'yyyyMMdd_HHmmss'
$LogFile = "user_deletion_log_$now.txt"
# Prepare log file with header
$logHeader = "User Deletion Log - Started at $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
Set-Content -Path $LogFile -Value $logHeader
function Write-Log {
param (
[string]$Message
)
Write-Host $Message
Add-Content -Path $LogFile -Value $Message
}
# Get the current user running the script
$scriptUser = $env:USERNAME
if (-not $scriptUser) { $scriptUser = $env:USER }
# Check if file exists
if (!(Test-Path $UserEmailFile)) {
Write-Log "ERROR: File '$UserEmailFile' not found."
exit 1
}
# Read user emails (ignore empty/comment lines)
$UserEmails = Get-Content $UserEmailFile | Where-Object { $_.Trim() -ne "" -and -not ($_ -like "#*") }
if ($UserEmails.Count -eq 0) {
Write-Log "No user emails found in the file."
exit 1
}
Write-Log "Read $($UserEmails.Count) user emails from $UserEmailFile..."
# Step 1: Fetch all subaccounts
Write-Log "Fetching subaccounts..."
.\btp list accounts/subaccount > subaccounts.txt
# Skip the header lines (assume first 2 lines are header and column desc)
$lines = Get-Content subaccounts.txt | Select-Object -Skip 2
foreach ($line in $lines) {
# Skip header/footer/blank lines
if ($line.Trim() -eq "" -or $line -match '^subaccount id:' -or $line -match '^subaccounts in') { continue }
# Split line by 2+ spaces (columns are separated by several spaces)
$fields = $line -split '\s{2,}'
if ($fields.Length -lt 2) { continue }
$subGuid = $fields[0].Trim()
$displayName = $fields[1].Trim()
Write-Log "`nFetching IDP trusts for subaccount: $displayName ($subGuid)..."
.\btp list security/trust --subaccount $subGuid > idp_trusts.txt
$trustLines = Get-Content idp_trusts.txt | Select-Object -Skip 1
$originKeys = @()
foreach ($trust in $trustLines) {
$trust = $trust.Trim()
if ($trust -match '(?<OriginKey>([a-zA-Z0-9\.\-]+|sap\.default))\s+(Active|Inactive)$') {
$originKey = $matches['OriginKey']
if ($originKey -and ($originKeys -notcontains $originKey)) {
$originKeys += $originKey
}
}
}
if ($originKeys.Count -eq 0) {
Write-Log "No origin keys found for subaccount $displayName ($subGuid)."
continue
}
foreach ($origin in $originKeys) {
foreach ($userEmail in $UserEmails) {
Write-Log "Deleting user $userEmail from origin $origin in subaccount $displayName ($subGuid)..."
.\btp delete security/user $userEmail --of-idp $origin --subaccount $subGuid
$timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
if ($LASTEXITCODE -eq 0) {
Write-Log "SUCCESS: User $userEmail deleted from subaccount $displayName, origin $origin by $scriptUser at $timestamp."
} else {
Write-Log "ERROR: User $userEmail not found, failed to delete User $userEmail from $displayName, origin $origin by $scriptUser at $timestamp."
}
}
}
}
Write-Log "`nDONE! User deletions attempted for all specified emails in $UserEmailFile, for all origins and all subaccounts."</code></pre>2026-01-01T05:43:28.335000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/how-to-export-all-users-with-origins-from-all-sap-btp-subaccounts-via-cli/ba-p/14299316How to Export All Users (with Origins) from All SAP BTP Subaccounts via CLI Automation2026-01-02T08:17:57.154000+01:00shasankgupta024https://community.sap.com/t5/user/viewprofilepage/user-id/877731<P><FONT color="#0000FF"><EM><STRONG>Introduction</STRONG></EM></FONT></P><P>If you manage a large SAP BTP Global Account, you may find it challenging to export a full user inventory—especially when your environment is segmented into multiple subaccounts and utilizes various identity provider origins (multiple trusts). <STRONG>The SAP BTP Cockpit does not offer a single "Export All Users" button at the global account level</STRONG>.</P><P>This blog <STRONG>demonstrates how to efficiently extract all users and their identity origins across all BTP subaccounts using the SAP BTP Command Line Interface (btp CLI) and PowerShell scripting.</STRONG></P><P><EM><FONT color="#0000FF"><STRONG>Prerequisites</STRONG></FONT></EM></P><UL><LI>btp CLI: Ensure you have downloaded and installed `btp.exe` (the SAP BTP CLI). [<A href="https://help.sap.com/docs/btp/sap-business-technology-platform/download-and-start-using-btp-cli-client" target="_self" rel="noopener noreferrer">Download Link</A>]</LI><LI>Login Required: Log in to your SAP BTP Global Account using the CLI: <STRONG>btp login</STRONG></LI><LI>Open a <STRONG>CMD window </STRONG>and enter:</LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shasankgupta24_bldr_1-1767035683871.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/357064iD700B913F1A138CB/image-size/large?v=v2&px=999" role="button" title="shasankgupta24_bldr_1-1767035683871.png" alt="shasankgupta24_bldr_1-1767035683871.png" /></span></P><UL><LI>Permissions: Your user should have sufficient permissions (Global Account Admin, Directory Admin, Subaccount Admin) to view users in the target scopes.</LI><LI>Windows PowerShell: The script example uses PowerShell, but similar logic can be implemented in Bash or Python.</LI><LI>Working Directory: Place your files in `C:\BTP` (or another folder of your choice).</LI></UL><P><FONT color="#0000FF"><EM><STRONG>Folder Structure</STRONG></EM></FONT></P><P>Suggested folder contents:</P><P>C:\BTP\btp.exe *(SAP BTP CLI executable)*<BR />C:\BTP\btp-all-users-with-origins.ps1 *(PowerShell script for extraction)*</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shasankgupta24_bldr_0-1767035617924.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/357063i839C3A9063401EE3/image-size/large?v=v2&px=999" role="button" title="shasankgupta24_bldr_0-1767035617924.png" alt="shasankgupta24_bldr_0-1767035617924.png" /></span></P><P> </P><P><FONT color="#0000FF"><EM><STRONG>PowerShell Script Overview</STRONG></EM></FONT></P><P>The script will:<BR />- List all directories and subaccounts in your global account.<BR />- For each subaccount, fetch all users and their identity provider origins.<BR />- Aggregate results into a CSV file for easy analysis and reporting.</P><P><SPAN>After logging in, <STRONG>Open Powershell Window</STRONG> and again change the folder to C:\BTP and run the PowerShell script with the following command: <STRONG>.\btp-all-users-with-origins.ps1</STRONG></SPAN></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shasankgupta24_bldr_2-1767035780947.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/357065i90EFF483F6EAB993/image-size/large?v=v2&px=999" role="button" title="shasankgupta24_bldr_2-1767035780947.png" alt="shasankgupta24_bldr_2-1767035780947.png" /></span></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shasankgupta24_bldr_3-1767035869907.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/357068iEC853B1A43F264CE/image-size/large?v=v2&px=999" role="button" title="shasankgupta24_bldr_3-1767035869907.png" alt="shasankgupta24_bldr_3-1767035869907.png" /></span></P><P><FONT color="#0000FF"><EM><STRONG>Conclusion</STRONG></EM></FONT></P><P>Automating the extraction of all users (with IdP origins) from SAP BTP’s global landscape is made possible via the btp CLI and PowerShell scripting. This approach helps admins map, reconcile, and audit user access efficiently, overcoming cockpit UI limitations.</P><P>Feel free to adapt or extend the script for additional reporting, periodic scheduled runs, or integration with ITSM tools.</P><P><STRONG>Code for PowerShell Script:</STRONG></P><P> </P><pre class="lia-code-sample language-php"><code>##-------------------------------------------------------------------------------------------------------------------------------------------------
# PowerShell Script: btp-all-users-with-origins.ps1
#
# This script fetches all subaccounts, extracts all IDP origin keys,
# and then fetches all users from each subaccount for each origin key
# using the IDP via "--of-idp <originKey>".
# The user details are saved to all_users_detailed_with_origins.csv.
# Output CSV header (includes IDP origin)
"subaccount_guid,subaccount_name,originKey,userUUID,email,roles,lastLogin" | Out-File -Encoding UTF8 all_users_detailed_with_origins.csv
# Step 1: List all subaccounts and extract subaccount GUIDs and names
Write-Host "Fetching subaccounts..."
.\btp list accounts/subaccount > subaccounts.txt
$subaccounts = @()
$subLines = Get-Content subaccounts.txt | Select-Object -Skip 4
foreach ($line in $subLines) {
if ($line.Trim() -eq "") { continue }
if ($line -match '^([a-f0-9\-]{36})\s+(.+)$') {
$subaccounts += @{
guid = $matches[1]
name = $matches[2]
}
}
}
# Step 2: Gather all IDP origin keys from all subaccounts (combine)
$idpOriginSet = @{}
foreach ($subaccount in $subaccounts) {
Write-Host "Fetching IDP trusts for: $($subaccount.name) ($($subaccount.guid))..."
.\btp list security/trust --subaccount $($subaccount.guid) > idp_trusts.txt
$trustLines = Get-Content idp_trusts.txt | Select-Object -Skip 1
foreach ($trust in $trustLines) {
$trust = $trust.Trim()
if ($trust -match '(?<OriginKey>([a-zA-Z0-9\.\-]+|sap\.default))\s+(Active|Inactive)$') {
$originKey = $matches['OriginKey']
if ($originKey) { $idpOriginSet[$originKey] = $true }
}
}
}
$idpOriginList = $idpOriginSet.Keys
Write-Host "Collected IDP origin keys:"
$idpOriginList | ForEach-Object { Write-Host $_ }
# Step 3: For each subaccount and each origin key, get users with origin filtering
foreach ($subaccount in $subaccounts) {
foreach ($originKey in $idpOriginList) {
Write-Host "Fetching users for subaccount: $($subaccount.name) ($($subaccount.guid)) with origin: $originKey..."
.\btp list security/user --subaccount $($subaccount.guid) --of-idp $originKey > users.txt
$userLines = Get-Content users.txt | Where-Object {
($_ -match '\S') -and
($_ -notmatch 'username') -and
($_ -notmatch '^OK$') -and
($_ -notmatch '^No users found')
}
foreach ($userline in $userLines) {
$email = $userline.Trim()
if ($email -eq "") { continue }
# Get user details
$userDetails = .\btp get security/user $email --subaccount $($subaccount.guid) 2>&1
# Extract UUID (user ID)
$userIdLine = $userDetails | Where-Object { $_ -match '^id:' }
$userUUID = if ($userIdLine) { $userIdLine -replace '^id:\s*', '' } else { "" }
# Extract Role Collections
$roleLines = $userDetails | Select-String -Pattern '^ - '
$roles = if ($roleLines) { ($roleLines | ForEach-Object { $_.ToString().Trim() }) -join ';' } else { "" }
# Extract Last Login
$loginLine = $userDetails | Where-Object { $_ -match '^Last Login:' }
$lastLogin = if ($loginLine) { $loginLine -replace '^Last Login:\s*', '' } else { "N/A" }
"$($subaccount.guid),$($subaccount.name),$originKey,$userUUID,$email,$roles,$lastLogin" | Out-File -Append -Encoding UTF8 all_users_detailed_with_origins.csv
}
}
}
Write-Host "DONE! Output saved to all_users_detailed_with_origins.csv"
##-------------------------------------------------------------------------------------------------------------------------------------------------
</code></pre>2026-01-02T08:17:57.154000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/new-expert-guided-implementation-joule-prerequisites-and-activation/ba-p/14308272New Expert-Guided Implementation: Joule Prerequisites and Activation2026-01-16T00:06:43.973000+01:00mirnachaaninehttps://community.sap.com/t5/user/viewprofilepage/user-id/8362<P><A href="https://learning.sap.com/live-sessions/egi-activating-joule-the-pre-requisites?searchId=aab4c49d-0a88-4e47-8398-8d02ecd57a17&listPosition=1" target="_self" rel="noopener noreferrer"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mirnachaanine_0-1769125086418.png" style="width: 721px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364277i4E3AD51202FE9C69/image-dimensions/721x155?v=v2" width="721" height="155" role="button" title="mirnachaanine_0-1769125086418.png" alt="mirnachaanine_0-1769125086418.png" /></span></A></P><H4 id="toc-hId-2046019507">Establish the Foundation for Your AI Journey </H4><P><SPAN>SAP Joule is transforming how organizations interact with SAP applications by bringing intelligence directly into everyday workflows. For customers to activate Joule and unlock its AI-powered capabilities, they must first prepare their SAP Cloud Identity Services (CIS), SAP Business Technology Platform (BTP), and integration foundations to fully realize the value of Joule from day one.</SPAN><SPAN> </SPAN></P><P><SPAN>To support customers with this essential preparation, we are pleased to introduce a new Expert-Guided Implementation (EGI): </SPAN><SPAN> </SPAN></P><P><A href="https://learning.sap.com/live-sessions/egi-activating-joule-the-pre-requisites?searchId=aab4c49d-0a88-4e47-8398-8d02ecd57a17&listPosition=1" target="_self" rel="noopener noreferrer"><STRONG><SPAN>Joule Prerequisites & Activation</SPAN></STRONG><SPAN> </SPAN></A><SPAN>- a hands-on, expert-led program designed to help you configure all required technical components for a smooth Joule activation.</SPAN><SPAN> </SPAN></P><P><SPAN>This new offering helps customers understand Joule’s architecture, explore deployment options, configure platform prerequisites, and establish the identity and access foundation required for a secure activation. By the end of the EGI, participants will be positioned to complete all the prerequisites required to </SPAN><STRONG><SPAN>activate Joule</SPAN></STRONG><SPAN>, ensuring a seamless start to their AI adoption journey.</SPAN><SPAN> <BR /><BR /></SPAN></P><H4 id="toc-hId-1849506002">Workshop Schedule<SPAN> </SPAN></H4><P>To ensure global participation, this session will be offered across multiple time zones.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mirnachaanine_0-1772831457379.png" style="width: 15px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/380830i0FF880CDA0526ECD/image-dimensions/15x15?v=v2" width="15" height="15" role="button" title="mirnachaanine_0-1772831457379.png" alt="mirnachaanine_0-1772831457379.png" /></span> For the latest schedule and registration details, please visit <SPAN><A href="https://learning.sap.com/live-sessions/egi-activating-joule-the-pre-requisites?searchId=aab4c49d-0a88-4e47-8398-8d02ecd57a17&listPosition=1" target="_blank" rel="noopener noreferrer">EGI: Activating Joule: The Pre-requisites</A>. </SPAN></P><H4 id="toc-hId-1652992497"><BR />Why This EGI Matters </H4><P><SPAN>Before Joule can be activated, customers must ensure the right technical prerequisites are in place—across SAP BTP, Cloud Identity Services, Build Work Zone, and Line-of-Business systems. This EGI provides:</SPAN><SPAN> </SPAN></P><UL><LI><SPAN>A </SPAN><STRONG><SPAN>clear, step-by-step path</SPAN></STRONG><SPAN> to completing these prerequisites</SPAN><SPAN> </SPAN></LI></UL><UL><LI><STRONG><SPAN>Expert-led</SPAN></STRONG><SPAN> </SPAN><STRONG><SPAN>guidance</SPAN></STRONG><SPAN> for setting up SAP Cloud Identity Services including Identity Authentication Service (IAS)/Identity Provisioning Service (IPS), and entitlements</SPAN><SPAN> </SPAN></LI></UL><UL><LI><STRONG><SPAN>Live configuration guidance</SPAN></STRONG><SPAN> in your SAP BTP environment and SAP Build Workzone (BWZ)</SPAN><SPAN> </SPAN></LI></UL><UL><LI><STRONG><SPAN>Hands-on support</SPAN></STRONG><SPAN> through real examples and troubleshooting</SPAN><SPAN> </SPAN></LI></UL><P><SPAN>With AI rapidly becoming central to SAP’s product strategy, organizations need the right technical foundation to adopt Joule with confidence, security, and scalability.</SPAN><SPAN> <BR /><BR /></SPAN></P><H4 id="toc-hId-1456478992">What You’ll Learn: Program Overview </H4><P><SPAN>This 2-day EGI blends instruction, demonstrations, and guided hands-on exercises.</SPAN><SPAN> </SPAN></P><P><STRONG><SPAN>Day 1 – Foundation & Architecture</SPAN></STRONG><SPAN> </SPAN></P><UL><LI><SPAN>Understand Joule’s system architecture and deployment scenarios</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Learn how SAP Cloud Identity Services (IAS/IPS), SAP BTP, SAP Build Work Zone, and LOB solutions work together</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Navigate BTP global accounts, subaccounts, entitlements, and subscriptions</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Validate system readiness and begin configuring your Joule environment</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Experience a live demonstration of Joule integrated with SAP SuccessFactors</SPAN><SPAN> </SPAN></LI></UL><P><STRONG><SPAN>Day 2 – Identity, Provisioning & Work Zone Integration</SPAN></STRONG><SPAN> </SPAN></P><UL><LI><SPAN>Deep-dive into SAP Cloud Identity Services - Identity Authentication (IAS) and Identity Provisioning (IPS) for Joule</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Integrate CIS with your corporate Identity Provider</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Configure SAP Build Workzone (BWZ) as the unified interface for Joule</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Establish trust relationships between systems</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Expose LOB content to BWZ and validate provisioning flows</SPAN><SPAN> </SPAN></LI></UL><H4 id="toc-hId-1259965487"><STRONG><SPAN><BR /></SPAN></STRONG>What You Will Achieve </H4><P><SPAN>This new EGI equips your organization with everything needed to prepare for Joule activation, ensuring compliance, security, and a streamlined technical foundation from day one.</SPAN><SPAN> </SPAN></P><P><SPAN>If your organization is planning to adopt SAP Joule or preparing for AI-driven innovation within SAP applications, this EGI is the ideal starting point to fast-track your readiness and reduce implementation risk.</SPAN><SPAN> </SPAN></P><P><SPAN>By the end of the EGI, you will have:</SPAN><SPAN> </SPAN></P><UL><LI><SPAN>A configured SAP BTP environment with a designated Joule subaccount</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Completed IAS/IPS setup for secure authentication and provisioning</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Integrated BWZ as the experience layer for Joule</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Verified all activation prerequisites using a comprehensive readiness checklist</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Gained expert-backed confidence to run the Joule Booster and proceed with activation</SPAN></LI></UL><H4 id="toc-hId-1063451982"><SPAN>How to Register <BR /></SPAN></H4><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mirnachaanine_1-1768517062801.png" style="width: 17px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361743i9F8DA86CD8872CFF/image-dimensions/17x17?v=v2" width="17" height="17" role="button" title="mirnachaanine_1-1768517062801.png" alt="mirnachaanine_1-1768517062801.png" /></span><STRONG><A href="https://learning.sap.com/live-sessions/egi-activating-joule-the-pre-requisites?searchId=aab4c49d-0a88-4e47-8398-8d02ecd57a17&listPosition=1" target="_blank" rel="noopener noreferrer">Register here to secure your spot</A>* </STRONG><SPAN>today to learn from SAP experts and gain the skills to bring <STRONG>Business AI to life</STRONG> across your enterprise.</SPAN></P><P><SPAN> * <EM>You may need to register your S-user on learning.sap.com to access the EGI registration page.</EM></SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mirnachaanine_0-1768519307900.png" style="width: 159px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361744i9721FA1F62F2C8E7/image-dimensions/159x159?v=v2" width="159" height="159" role="button" title="mirnachaanine_0-1768519307900.png" alt="mirnachaanine_0-1768519307900.png" /></span></P><H4 id="toc-hId-866938477">Related Articles</H4><P><STRONG><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/new-expert-guided-implementation-unlocking-joule-and-sap-business-ai-from/ba-p/14237653" target="_self">Unlocking Joule and SAP Business AI from Strategy to Activation: Expert-Guided Implementation</A></STRONG></P>2026-01-16T00:06:43.973000+01:00https://community.sap.com/t5/integration-blog-posts/secure-sap-ai-integration-using-advantco-openpgp-services/ba-p/14312233Secure SAP–AI Integration Using Advantco OpenPGP Services2026-01-22T18:25:33.866000+01:00peter_ha3https://community.sap.com/t5/user/viewprofilepage/user-id/185224<P><STRONG>Secure SAP–AI Integration Using Advantco OpenPGP Services</STRONG></P><P><STRONG>1. Purpose and Scope</STRONG></P><P>This article defines a secure, deployment-agnostic reference architecture for integrating SAP backend systems with external AI agents using OpenPGP-based cryptographic services provided by Advantco. The architecture separates cryptographic processing from data transport, ensuring that encryption, decryption, signing, and verification are performed by a dedicated cryptographic service layer, while message routing and orchestration remain the responsibility of the calling application or integration layer.</P><P>The architecture is intended for hybrid enterprise environments in which SAP backend systems may be deployed on-premise, in private cloud, on hyperscalers, or under RISE with SAP. AI agents may run on external platforms or managed AI services. Advantco OpenPGP services are exposed as APIs (REST and/or SOAP) and may be deployed on SAP Business Technology Platform or an equivalent enterprise runtime. This document describes a logical reference architecture and does not prescribe a specific deployment topology.</P><P>The scope of this document is limited to secure data exchange and trust establishment between SAP systems and AI agents. AI model behavior, prompt engineering, SAP business logic, and transport-level protocol selection are out of scope except where they affect security guarantees.</P><P><STRONG>2. Architectural Rationale</STRONG></P><P>Integrating SAP systems with external AI capabilities introduces a trust boundary between SAP-controlled environments and systems that operate outside SAP governance. This architecture addresses that boundary by enforcing message-level security that is independent of transport mechanisms and network topology.</P><P>Rather than embedding cryptographic logic into SAP applications or integration flows, the architecture externalizes OpenPGP operations into a dedicated cryptographic service layer. This allows encryption, decryption, signing, and verification to be centrally governed, audited, and evolved without requiring changes to SAP business applications. Transport and routing of messages remain the responsibility of SAP applications or integration components, preventing the cryptographic services from becoming an implicit integration broker.</P><P><STRONG>3. Architectural Overview</STRONG></P><P>The architecture consists of four logical concerns: SAP backend systems, an optional integration or orchestration layer, Advantco OpenPGP cryptographic services, and an external AI agent ecosystem.</P><P>SAP backend systems produce and consume business data but do not perform cryptographic operations directly. They rely on an integration or orchestration layer such as SAP Integration Suite, a SAP BTP application, or other middleware to coordinate message exchange with external systems where required.</P><P>Advantco OpenPGP services provide cryptographic transformation via APIs only. They do not perform message routing, transport, or forwarding.</P><P>External AI agents receive only signed and encrypted payloads and return responses in signed and encrypted form. Unencrypted payloads exist only within SAP-controlled trust boundaries.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Architecture diagram v3.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364171i55A1F7E8D95B8D0B/image-size/large?v=v2&px=999" role="button" title="Architecture diagram v3.png" alt="Architecture diagram v3.png" /></span></P><P>Advantco OpenPGP provides cryptographic APIs only and returns results to the caller. Message transport and routing are handled by SAP or integration components and are not performed by Advantco.</P><P><STRONG>4. Architecture Structure</STRONG></P><P>From a business perspective, the architecture enables SAP processes to consume AI-generated insights without relinquishing control over data confidentiality or trust decisions. AI systems may influence SAP outcomes, but only after cryptographic validation and SAP-side authorization.</P><P>From an application perspective, the architecture separates responsibilities clearly. SAP backend systems focus on business logic. The integration or orchestration layer handles routing, retries, and protocol adaptation. Advantco OpenPGP services handle cryptographic transformation. AI agents handle AI processing only.</P><P>From an integration perspective, communication is message-based and transport-agnostic. Payload-level security is applied using OpenPGP before data crosses trust boundaries, ensuring that transport security is an additional layer rather than the primary protection mechanism.</P><P>From a data perspective, unencrypted payload exists only within SAP-controlled environments. Outside those boundaries, data is always exchanged in signed and encrypted form, accompanied by cryptographic metadata required for verification and audit.</P><P><STRONG>5. Component Responsibilities</STRONG></P><P>SAP backend systems remain the authoritative producers and consumers of business data. They initiate outbound requests and consume inbound results but delegate cryptographic processing to external services. SAP systems do not store or manage cryptographic private keys.</P><P>The integration or orchestration layer (where present) is responsible for transport, routing, protocol handling, retries, correlation, and error handling. It invokes Advantco OpenPGP APIs as required and forwards encrypted payloads to external AI agents, and returns verified payloads to SAP systems. It does not perform cryptographic operations beyond invoking the cryptographic service APIs.</P><P>Advantco OpenPGP services provide cryptographic operations as APIs. For outbound processing, they accept payloads and perform optional compression, message digest generation, digital signing, and OpenPGP hybrid encryption. For inbound processing, they accept encrypted payloads, verify digital signatures, decrypt content under governed key controls, and return verified payloads to the caller. These services are stateless with respect to message routing and do not forward data to external systems.</P><P>External AI agents operate outside the SAP trust boundary and are treated as untrusted by default. They can only process data that they have successfully decrypted and verified using trusted SAP public keys. AI agents sign and encrypt all outbound responses using their own private keys and do not receive access to SAP private keys or verified SAP payloads.</P><P>Key management is handled by a centralized Key Management Service that governs cryptographic key lifecycles, enforces usage policies, and records audit events. Agent identities are established by registering and allow-listing agent public keys, typically identified by fingerprints or key identifiers. Private keys remain protected and are never exposed outside the cryptographic service boundary.</P><P><STRONG>6. Message Exchange</STRONG></P><P>The Advantco OpenPGP APIs may be invoked directly by SAP applications or by an intermediate integration or orchestration layer. In all cases, Advantco performs cryptographic transformation only and does not forward messages.</P><P>In the outbound flow, SAP backend systems submit payloads for signing and encryption via the Advantco OpenPGP service. The service returns a signed and encrypted payload to the caller, which is responsible for forwarding the encrypted message to the external AI agent.</P><P>In the inbound flow, the external AI agent produces a signed and encrypted response. The encrypted response is submitted to the Advantco OpenPGP service for verification and decryption. The service returns a verified payload to the caller, which delivers the result to the SAP backend system.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="sequence.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364172iB37D07B204A6B275/image-size/large?v=v2&px=999" role="button" title="sequence.png" alt="sequence.png" /></span></P><P>The sequence diagram above illustrates the strict request–response nature of the Advantco OpenPGP APIs and the separation of cryptographic processing from message transport and routing.</P><P><STRONG>7. Trust and Security Model</STRONG></P><P>Trust in this architecture is based on cryptographic identity rather than network location. Public-key identities establish which parties may exchange data, while centralized key governance determines how keys may be used. By default, no shared secrets are required between SAP systems and AI agents.</P><P>Confidentiality is enforced through OpenPGP hybrid encryption. Integrity and authenticity are enforced through digital signatures. Auditability is provided through centralized logging of cryptographic operations. Replay protection is enforced by the receiving side using message identifiers, timestamps, and validity windows.</P><P>Cryptographic validity does not imply business authorization. AI-generated responses or instructions must still be validated against schemas, allow-listed actions, and SAP-side authorization rules before affecting SAP business processes.</P><P><STRONG>8. Deployment Considerations</STRONG></P><P>The architecture supports a wide range of deployment models, including scenarios in which SAP systems and integration components run on SAP BTP while cryptographic services are cloud-hosted and AI agents operate on external platforms. Security and correctness depend on logical separation of responsibilities rather than physical co-location.</P><P>As a concrete implementation option, Advantco OpenPGP services are available for deployment on SAP Business Technology Platform (SAP BTP). In this model, the cryptographic services run as managed applications or services on SAP BTP and expose OpenPGP functionality through REST and/or SOAP APIs. SAP backend systems and SAP integration components can invoke these APIs directly using standard SAP-supported connectivity mechanisms. Deployment on SAP BTP does not change the logical architecture described in this document; Advantco OpenPGP continues to operate strictly as a cryptographic service and does not perform message routing or transport.</P><P><STRONG>9. Conclusion</STRONG></P><P>This reference architecture defines a clear separation between cryptographic services, message transport, and business logic for secure SAP–AI integration. By exposing OpenPGP operations as governed APIs and keeping data transport outside the cryptographic service boundary, the architecture enables strong security guarantees while remaining flexible, deployment-neutral, and suitable for enterprise use.</P><P><STRONG>10. Sources</STRONG></P><P><A href="https://www.sap.com/products/technology-platform.html" target="_self" rel="noopener noreferrer">https://www.sap.com/products/technology-platform.html</A><BR /><A href="https://www.rfc-editor.org/rfc/rfc4880" target="_self" rel="nofollow noopener noreferrer">https://www.rfc-editor.org/rfc/rfc4880</A><BR /><A href="https://owasp.org/www-project-api-security/" target="_self" rel="nofollow noopener noreferrer">https://owasp.org/www-project-api-security/</A><BR /><A href="https://www.advantco.com/sap-integration-adapters/sap-pgp-integration" target="_self" rel="nofollow noopener noreferrer">https://www.advantco.com/sap-integration-adapters/sap-pgp-integration</A></P>2026-01-22T18:25:33.866000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/configure-role-owner-stage-auto-approval-in-sap-iag/ba-p/14308750Configure Role Owner Stage Auto Approval in SAP IAG2026-01-23T06:15:25.857000+01:00SuryaPrakash_Machavarapuhttps://community.sap.com/t5/user/viewprofilepage/user-id/2274419<P><STRONG>Introduction</STRONG></P><P>This blog explains how to configure Role Owner Stage Auto Approval in IAG. focusing on setting up the required data objects, business rules, and workflow configuration to automate approvals.</P><P><STRONG>Step 1: Create Data Object</STRONG></P><P>Create a data object called <STRONG>RoleOwnerAttributes</STRONG>. This object holds the input values used to determine whether the Role Owner stage should be automatically approved.</P><P>Add the following attributes to the data object:</P><UL><LI>roleName (String)</LI><LI>roleCriticality (String)</LI><LI>roleApprover (String)</LI><LI>roleBusinessProcess (String)</LI><LI>roleSubprocess (String)</LI><LI>roleRiskCount (Number)<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SuryaPrakash_Machavarapu_0-1769169958942.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364560iDF3842AFE0B0991C/image-size/large?v=v2&px=999" role="button" title="SuryaPrakash_Machavarapu_0-1769169958942.png" alt="SuryaPrakash_Machavarapu_0-1769169958942.png" /></span><P> </P></LI></UL><P><STRONG>Step 2: Create another Data Object </STRONG></P><P>Create another data object called <STRONG>AutoApproveRoleOwnerStage</STRONG>. This object stores the output of the rule.</P><P>Add the following attributes to the data object:</P><UL><LI>roleName (String)</LI><LI>roleOwnerAutoStage (Boolean)<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SuryaPrakash_Machavarapu_1-1769169958949.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364561i1F32A140A8F35A87/image-size/large?v=v2&px=999" role="button" title="SuryaPrakash_Machavarapu_1-1769169958949.png" alt="SuryaPrakash_Machavarapu_1-1769169958949.png" /></span><P> </P></LI></UL><P><BR /><STRONG>Step 3: Create Local Rule</STRONG><BR />Create a local rule called <STRONG>RoleOwnerStageAutoRule</STRONG></P><P>decision table settings:</P><UL><LI>Use the fields from <STRONG>RoleOwnerAttributes</STRONG> (Step 1) as the <STRONG>conditions</STRONG>.</LI><LI>Use <STRONG>AutoApproveRoleOwnerStage</STRONG> (Step 2) as the <STRONG>result</STRONG>.</LI></UL><P>Result Attributes:</P><UL><LI>Role Owner Auto Stage → Access: <STRONG>Editable</STRONG></LI><LI>Role Name → Access: <STRONG>Hidden</STRONG></LI><LI>Set the hardcoded value as the <STRONG>roleName from RoleOwnerAttributes.</STRONG></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SuryaPrakash_Machavarapu_2-1769169958959.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364562i1A27DAB1957F3995/image-size/large?v=v2&px=999" role="button" title="SuryaPrakash_Machavarapu_2-1769169958959.png" alt="SuryaPrakash_Machavarapu_2-1769169958959.png" /></span><SPAN>In this scenario, the condition is defined based on the Role Name.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SuryaPrakash_Machavarapu_3-1769169958966.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364565i6E32B7A8800AFA8E/image-size/large?v=v2&px=999" role="button" title="SuryaPrakash_Machavarapu_3-1769169958966.png" alt="SuryaPrakash_Machavarapu_3-1769169958966.png" /></span></P><P> </P><P>Step 4: Create Rule Set</P><P>Create a rule set called <STRONG>RoleOwnerRuleSet </STRONG> and add the local rule <STRONG>RoleOwnerStageAutoRule</STRONG> (from Step 3) to it.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SuryaPrakash_Machavarapu_4-1769169958971.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364563i4EBBE1941F1C56D3/image-size/large?v=v2&px=999" role="button" title="SuryaPrakash_Machavarapu_4-1769169958971.png" alt="SuryaPrakash_Machavarapu_4-1769169958971.png" /></span></P><P> </P><P><STRONG>Step 5: Create Rule Service</STRONG></P><P>Create a rule service called <STRONG>AutoApproveRoleOwnerStage</STRONG>.</P><UL><LI><STRONG>Input</STRONG> → RoleOwnerAttributes (from Step 1)</LI><LI><STRONG>Result</STRONG> → AutoApproveRoleOwnerStage (from Step 2)</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SuryaPrakash_Machavarapu_5-1769169958976.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364564iF128A564D349DC4A/image-size/large?v=v2&px=999" role="button" title="SuryaPrakash_Machavarapu_5-1769169958976.png" alt="SuryaPrakash_Machavarapu_5-1769169958976.png" /></span></P><P> </P><P><STRONG>Step 6: Assign Rule Service</STRONG></P><P>Assign the rule service <STRONG>AutoApproveRoleOwnerStage</STRONG> (from Step 5) to the rule set <STRONG>RoleOwnerRuleSe</STRONG>t (from Step 4).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SuryaPrakash_Machavarapu_6-1769169958981.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364566i669B685D247F8FD9/image-size/large?v=v2&px=999" role="button" title="SuryaPrakash_Machavarapu_6-1769169958981.png" alt="SuryaPrakash_Machavarapu_6-1769169958981.png" /></span></P><P> </P><P><STRONG>Step 7: Activate and Deploy</STRONG></P><P>Activate all the created objects and deploy the business rule service. If any changes are made, the service must be deployed again.</P><P><STRONG>Existing Workflow Setup</STRONG></P><P>In the current existing workflow, the access request is configured to follow the Role Owner approval path as the stage 1 during the approval process.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SuryaPrakash_Machavarapu_7-1769169958987.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364568i454F979113C3606B/image-size/large?v=v2&px=999" role="button" title="SuryaPrakash_Machavarapu_7-1769169958987.png" alt="SuryaPrakash_Machavarapu_7-1769169958987.png" /></span></P><P> </P><P><STRONG>Testing Scenario</STRONG></P><P>The following test scenario was performed to validate the configuration:</P><UL><LI>An access request was raised for the role PR_approver_0_1M.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SuryaPrakash_Machavarapu_8-1769169958991.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364567i574F015F3DBE1147/image-size/large?v=v2&px=999" role="button" title="SuryaPrakash_Machavarapu_8-1769169958991.png" alt="SuryaPrakash_Machavarapu_8-1769169958991.png" /></span></LI><LI>The audit log shows that the request was automatically approved by the system.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SuryaPrakash_Machavarapu_9-1769169958997.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364570i2E564CBDA85D6276/image-size/large?v=v2&px=999" role="button" title="SuryaPrakash_Machavarapu_9-1769169958997.png" alt="SuryaPrakash_Machavarapu_9-1769169958997.png" /></span></LI><LI>The Access request status shows that it moved to the Risk Owner stage, confirming that the Role Owner stage was automatically approved successfully.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SuryaPrakash_Machavarapu_10-1769169959002.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364569i989392EC4F87CEC6/image-size/large?v=v2&px=999" role="button" title="SuryaPrakash_Machavarapu_10-1769169959002.png" alt="SuryaPrakash_Machavarapu_10-1769169959002.png" /></span></LI></UL><P><STRONG>Conclusion</STRONG></P><P>Role Owner stage auto approval reduces manual effort and speeds up the approval process for eligible access requests. Using rule-based conditions, organizations can automatically approve condition based requests while keeping manual approvals for critical cases.</P>2026-01-23T06:15:25.857000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/runtime-threat-detection-for-sap-btp-kyma-with-azure-arc-microsoft-defender/ba-p/14319899Runtime Threat Detection for SAP BTP Kyma with Azure Arc + Microsoft Defender for Containers2026-02-02T15:52:32.766000+01:00haithamshahinhttps://community.sap.com/t5/user/viewprofilepage/user-id/2275053<H1 id="securing-an-external-kubernetes-cluster-with-microsoft-defender-for-containers-via-azure-arc-" id="toc-hId-1659730497">Securing an external Kubernetes cluster with Microsoft Defender for Containers (via Azure Arc)</H1><P>When I say "secure Kubernetes", I'm not just thinking about admission policies and CIS checklists. I'm thinking about what happens when <STRONG>something is already running</STRONG> and turns malicious — a web shell lands in a pod, a container starts burning CPU for crypto mining, or someone drops network scanning tools into an otherwise boring workload.</P><P>If you're running <STRONG>SAP BTP Kyma runtime</STRONG>, this matters. Kyma has strong <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/kyma-security-concepts#kubernetes-control-plane" target="_blank" rel="noopener noreferrer">platform hardening</A> (Gardener-managed control plane, DISA STIG alignment), and API server audit logs exist — but those logs go to <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/auditing-and-logging-information-in-kyma" target="_blank" rel="noopener noreferrer">SAP's Platform Logging Service</A>, not directly to you. That's fine for platform-level auditing, but it's not the same as <STRONG>seeing threats inside your workloads at runtime</STRONG>.</P><P>That's the gap I'm filling: <STRONG>runtime threat detection</STRONG> — the ability to detect and alert on malicious activity (crypto mining, web shells, credential theft) while workloads are running.</P><HR /><H2 id="real-world-threats" id="toc-hId-1592299711">Real-world threats</H2><P>These aren't hypotheticals — crypto mining and container compromise campaigns are actively targeting Kubernetes clusters:</P><P><STRONG>DERO Cryptojacking (2023–2024)</STRONG>: Attackers scanned for misconfigured Kubernetes API servers, then deployed DaemonSets named "proxy-api" to blend in with legitimate cluster components. The mining process itself was named "pause" — masquerading as the standard Kubernetes pause container. CrowdStrike found malicious images with over 10,000 pulls on Docker Hub. <STRONG>How runtime detection helps</STRONG>: Defender's eBPF monitoring catches unusual process spawning from "pause" containers and flags sustained high CPU from processes that shouldn't be compute-intensive. (Source: <A href="https://www.crowdstrike.com/en-us/blog/crowdstrike-discovers-first-ever-dero-cryptojacking-campaign-targeting-kubernetes/" target="_blank" rel="noopener nofollow noreferrer">CrowdStrike — DERO Cryptojacking Discovery</A>)</P><P><STRONG>Kinsing Campaign (2023–ongoing)</STRONG>: This campaign exploits vulnerabilities in PostgreSQL, WebLogic, Liferay, and WordPress to gain initial access to containers, then pivots to deploy crypto miners across the cluster. The campaign has affected 75+ cloud-native applications. <STRONG>How runtime detection helps</STRONG>: Defender detects process genealogy anomalies — for example, a WebLogic process spawning shell commands that enumerate Kubernetes resources or deploy new containers.</P><P>The pattern: attackers get in through a misconfiguration or vulnerability, then run workloads <STRONG>inside</STRONG> the cluster. Admission policies and CIS benchmarks don't catch threats that start after deployment — that's the gap runtime detection fills.</P><HR /><H2 id="the-solution-azure-arc-defender-for-containers" id="toc-hId-1395786206">The solution: Azure Arc + Defender for Containers</H2><P>For non-AKS clusters, the approach is: <STRONG>Azure Arc</STRONG> (makes the cluster an Azure resource) + <STRONG>Defender for Containers</STRONG> (deploys the runtime sensor as an Arc extension).</P><P><STRONG>What gets installed</STRONG>:</P><UL><LI><STRONG>Arc agents</STRONG> (<CODE>azure-arc</CODE> namespace): maintain outbound connection to Azure</LI><LI><STRONG>Defender sensor</STRONG> (DaemonSet on each node): collects runtime telemetry via eBPF — process creation, network activity, system calls</LI></UL><P><STRONG>What the sensor detects</STRONG>: crypto mining patterns, web shell activity, network scanning tools, binary drift. (Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/alerts-containers#workload-runtime-detection" target="_blank" rel="noopener nofollow noreferrer">Workload runtime detection</A>)</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="kyma-defender-architecture.png" style="width: 942px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368106iA5FA9AA45DFD92C3/image-size/large?v=v2&px=999" role="button" title="kyma-defender-architecture.png" alt="kyma-defender-architecture.png" /></span></P><P>Arc also provides an <STRONG>extension platform</STRONG> — Defender isn't the only add-on you can deploy this way. And Microsoft provides a <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">verification checklist</A> so you can prove it's working.</P><P><STRONG>Networking note</STRONG>: Both Arc and Defender require outbound connectivity. If egress is blocked, onboarding fails silently. Check the <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/network-requirements" target="_blank" rel="noopener nofollow noreferrer">Arc network requirements</A> and ensure <CODE>*.cloud.defender.microsoft.com:443</CODE> is allowed.</P><HR /><H2 id="how" id="toc-hId-1199272701">How</H2><P>I’ll show a portal-first path (fastest to understand), then a programmatic path (fastest to automate).</P><H3 id="step-0-pre-flight-checklist" id="toc-hId-1131841915">Step 0 — Pre-flight checklist</H3><P>Here’s what I personally confirm before I touch the portal:</P><P>1) <STRONG>Network egress (outbound)</STRONG></P><UL><LI>Arc agents require outbound access to a set of URLs (Azure Resource Manager, Entra ID token endpoints, container registries for pulling agent images, and more depending on features). (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/network-requirements" target="_blank" rel="noopener nofollow noreferrer">Azure Arc-enabled Kubernetes network requirements</A>)</LI><LI>Defender for Containers on Arc requires outbound access to <CODE>*.cloud.defender.microsoft.com:443</CODE>. (Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-portal" target="_blank" rel="noopener nofollow noreferrer">Enable Defender for Containers on Arc-enabled Kubernetes (portal)</A>)</LI></UL><P>2) <STRONG>Tooling</STRONG></P><UL><LI>Azure CLI + the <CODE>connectedk8s</CODE> extension (for Arc onboarding). (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/quickstart-connect-cluster" target="_blank" rel="noopener nofollow noreferrer">Quickstart: Connect an existing Kubernetes cluster to Azure Arc</A>)</LI><LI>If I want to script extension deployment, I also install the <CODE>k8s-extension</CODE> extension. (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/extensions" target="_blank" rel="noopener nofollow noreferrer">Deploy and manage Arc-enabled Kubernetes extensions</A>)</LI></UL><P>3) <STRONG>Cluster access</STRONG></P><UL><LI><CODE>kubectl</CODE> works and points at the cluster I’m onboarding.</LI><LI>If I’m missing kubeconfig on my workstation, the Kyma Dashboard has a <STRONG>Download kubeconfig</STRONG> link for the cluster.</LI><LI>I sanity-check that my kubeconfig/current context is the Kyma cluster before running anything destructive:</LI></UL><PRE><CODE>kubectl <SPAN class="">config</SPAN> current-<SPAN class="">context</SPAN>
kubectl cluster-info</CODE></PRE><UL><LI>I have capacity for Arc agents (the Arc quickstart calls out resource requirements and that agents are deployed on connect). (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/quickstart-connect-cluster" target="_blank" rel="noopener nofollow noreferrer">Quickstart: Connect an existing Kubernetes cluster to Azure Arc</A>)</LI></UL><H3 id="step-1-connect-the-cluster-to-azure-arc" id="toc-hId-935328410">Step 1 — Connect the cluster to Azure Arc</H3><P>I typically do this from a workstation that already has <CODE>kubectl</CODE> access to the cluster.</P><H4 id="1-1-register-providers-if-needed-" id="toc-hId-867897624">1.1 Register providers (if needed)</H4><P>The Arc quickstart includes registering resource providers like <CODE>Microsoft.Kubernetes</CODE>, <CODE>Microsoft.KubernetesConfiguration</CODE>, and <CODE>Microsoft.ExtendedLocation</CODE>. (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/quickstart-connect-cluster" target="_blank" rel="noopener nofollow noreferrer">Quickstart: Connect an existing Kubernetes cluster to Azure Arc</A>)</P><H4 id="1-2-run-the-connect-command" id="toc-hId-671384119">1.2 Run the connect command</H4><P>From the Arc quickstart, the core command is:</P><PRE><CODE>az connectedk8s connect --<SPAN class="">name</SPAN> <cluster-<SPAN class="">name</SPAN>> --resource-<SPAN class="">group</SPAN> <resource-<SPAN class="">group</SPAN>></CODE></PRE><P>In practice, I prefer to be explicit (especially on shared subscriptions) and set <CODE>--location</CODE> and <CODE>--tags</CODE>:</P><PRE><CODE>az connectedk8s connect \
--name <SPAN class=""><cluster-name></SPAN> \
--resource-group <SPAN class=""><resource-group></SPAN> \
--location <SPAN class=""><azure-region></SPAN> \
--<SPAN class="">tags</SPAN> env=<SPAN class=""><env></SPAN> owner=<SPAN class=""><team></SPAN> <SPAN class="">system</SPAN>=<SPAN class=""><system></SPAN>
</CODE></PRE><P>What I’m explicitly setting there:</P><UL><LI><CODE>--location</CODE>: the Azure region where the <STRONG>Azure Arc-enabled Kubernetes resource</STRONG> is created. If you omit it, it’s created in the same region as the resource group.</LI><LI><CODE>--tags</CODE>: Azure Resource Manager tags on the Arc resource (space-separated <CODE>key[=value]</CODE>).</LI></UL><P>If this command hangs or fails in weird ways, I go back to egress first — the Arc network requirements doc is the authoritative “what URLs/ports must my cluster reach?” list. (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/network-requirements" target="_blank" rel="noopener nofollow noreferrer">Azure Arc-enabled Kubernetes network requirements</A>)</P><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/quickstart-connect-cluster" target="_blank" rel="noopener nofollow noreferrer">Quickstart: Connect an existing Kubernetes cluster to Azure Arc</A> and <A href="https://learn.microsoft.com/en-us/cli/azure/connectedk8s?view=azure-cli-latest#az-connectedk8s-connect" target="_blank" rel="noopener nofollow noreferrer">Azure CLI reference — az connectedk8s connect</A>)</P><H4 id="1-3-verify-arc-agents-in-the-cluster" id="toc-hId-474870614">1.3 Verify Arc agents in the cluster</H4><P>The quickstart calls out that Arc deploys agents into the <CODE>azure-arc</CODE> namespace. I validate that they’re <CODE>Running</CODE>:</P><PRE><CODE>kubectl <SPAN class="">get</SPAN> deployments,pods -n azure-<SPAN class="">arc</SPAN>
</CODE></PRE><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/quickstart-connect-cluster" target="_blank" rel="noopener nofollow noreferrer">Quickstart: Connect an existing Kubernetes cluster to Azure Arc</A>)</P><P>Here’s what that looks like in practice on my Kyma cluster:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="arc-pods-kyma.png" style="width: 904px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368107i5371DF84949A9569/image-size/large?v=v2&px=999" role="button" title="arc-pods-kyma.png" alt="arc-pods-kyma.png" /></span></P><P>And here’s the connected cluster resource in Azure (showing things like connectivity status, location, and tags):</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="arc-kyma-ui.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368108i00A2C62A41C26166/image-size/large?v=v2&px=999" role="button" title="arc-kyma-ui.png" alt="arc-kyma-ui.png" /></span></P><P>At this point, if Arc isn’t healthy, I stop and fix that first. Everything else depends on it.</P><H3 id="step-2-enable-the-containers-plan-in-microsoft-defender-for-cloud" id="toc-hId-149274390">Step 2 — Enable the Containers plan in Microsoft Defender for Cloud</H3><P>Now I go to Defender for Cloud and enable the <STRONG>Containers</STRONG> plan for the subscription where my Arc-enabled cluster lives.</P><P>The portal walkthrough is:</P><UL><LI>Microsoft Defender for Cloud → <STRONG>Environment settings</STRONG> → pick subscription → toggle <STRONG>Containers</STRONG> plan On</LI><LI>Select <STRONG>Settings</STRONG> next to the Containers plan → choose <STRONG>Enable specific components</STRONG></LI></UL><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-portal" target="_blank" rel="noopener nofollow noreferrer">Enable Defender for Containers on Arc-enabled Kubernetes (portal)</A>)</P><P>At this point you’ll be asked which Containers plan components to enable.</P><P>You <EM>can</EM> enable everything, but for this post I’m intentionally focusing on the <STRONG>Defender sensor</STRONG> (runtime detections). The important callout: <STRONG>from a pricing perspective there’s no cost benefit to enabling one vs. many — the cost is the same</STRONG> — so this is purely about keeping the walkthrough scoped to runtime detection.</P><P>Here’s what that looks like in the portal (first the Containers plan settings, then the component selection where I keep only the sensor in scope):</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="enable-defender-containers-settings.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368109iBE82CDA5D44C2406/image-size/large?v=v2&px=999" role="button" title="enable-defender-containers-settings.png" alt="enable-defender-containers-settings.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="defender-settings-details.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368110i15410E5DD773E877/image-size/large?v=v2&px=999" role="button" title="defender-settings-details.png" alt="defender-settings-details.png" /></span></P><H3 id="step-3-deploy-defender-components-to-the-arc-enabled-cluster" id="toc-hId--122470484">Step 3 — Deploy Defender components to the Arc-enabled cluster</H3><P>I use one of two flows.</P><H4 id="option-a-recommended-deploy-via-defender-for-cloud-recommendations" id="toc-hId--612386996">Option A (recommended): Deploy via Defender for Cloud Recommendations</H4><P>This is the “guided remediation” path:</P><UL><LI>Defender for Cloud → <STRONG>Recommendations</STRONG></LI><LI>Find “Azure Arc-enabled Kubernetes clusters should have Defender extension installed”</LI><LI>Select the clusters → <STRONG>Fix</STRONG></LI></UL><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-portal" target="_blank" rel="noopener nofollow noreferrer">Enable Defender for Containers on Arc-enabled Kubernetes (portal)</A>)</P><H4 id="option-b-deploy-manually-from-the-arc-cluster-resource" id="toc-hId--808900501">Option B: Deploy manually from the Arc cluster resource</H4><P>If I want explicit control (or I’m debugging), I do:</P><UL><LI>Arc-enabled Kubernetes resource → <STRONG>Extensions</STRONG> → <STRONG>+ Add</STRONG></LI><LI>Install <STRONG>Microsoft Defender for Containers</STRONG></LI><LI>Choose/configure the <STRONG>Log Analytics workspace</STRONG> during installation (this is where the extension sends collected logs/telemetry used by Defender for Cloud and Azure Monitor Logs)<UL><LI>I can select an existing workspace, create a new one, or use the default: <CODE>DefaultWorkspace-[subscription-id]-[region]</CODE></LI></UL></LI></UL><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-portal" target="_blank" rel="noopener nofollow noreferrer">Enable Defender for Containers on Arc-enabled Kubernetes (portal)</A>)</P><H3 id="step-4-optional-programmatic-deployment-repeatable-automation-" id="toc-hId--712010999">Step 4 (optional) — Programmatic deployment (repeatable automation)</H3><P>If I’m onboarding clusters at scale, I don’t want a click path. The programmatic doc gives the Azure CLI commands for creating the Defender extension.</P><P>Defender sensor extension:</P><P>Note: Some examples include an <CODE>auditLogPath</CODE> setting for clusters where you control the API server audit log file location. In Kyma, audit logs are handled via SAP’s Platform Logging Service and you generally don’t have direct access to that file path, so I’m omitting it here.</P><PRE><CODE>az k8s-extension create \
-<SPAN class="">-name microsoft.azuredefender.kubernetes \</SPAN> -<SPAN class="">-cluster-type connectedClusters \</SPAN> -<SPAN class="">-cluster-name <cluster-name> \</SPAN> -<SPAN class="">-resource-group <resource-group> \</SPAN> -<SPAN class="">-extension-type microsoft.azuredefender.kubernetes \</SPAN> -<SPAN class="">-configuration-settings \</SPAN> logAnalyticsWorkspaceResourceID="/subscriptions/<subscription-id>/resourceGroups/<rg>/providers/Microsoft.OperationalInsights/workspaces/<workspace-name>"</CODE></PRE><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-programmatically" target="_blank" rel="noopener nofollow noreferrer">Deploy Defender for Containers on Arc-enabled Kubernetes (programmatic)</A>)</P><P>If you need the generic “how do extensions work / how do I list/update/delete them” reference, the Arc extensions doc is the canonical place. (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/extensions" target="_blank" rel="noopener nofollow noreferrer">Deploy and manage Arc-enabled Kubernetes extensions</A>)</P><H3 id="step-5-verify-it-s-actually-working" id="toc-hId--908524504">Step 5 — Verify it’s actually working</H3><P>This is where I slow down and prove success.</P><P>Microsoft’s verification checklist is:</P><UL><LI>Arc connection is healthy</LI><LI>Defender extension shows as installed</LI><LI>Sensor pods are running</LI><LI>Alerts appearing</LI></UL><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">Verify Defender for Containers on Arc-enabled Kubernetes</A>)</P><H4 id="5-1-verify-arc-connectivity" id="toc-hId--1398441016">5.1 Verify Arc connectivity</H4><PRE><CODE>az connectedk8s show \
-<SPAN class="">-name <cluster-name> \</SPAN> -<SPAN class="">-resource-group <resource-group> \</SPAN> -<SPAN class="">-query connectivityStatus</SPAN>
</CODE></PRE><P>The expected output is <CODE>Connected</CODE>. (Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">Verify Defender for Containers on Arc-enabled Kubernetes</A>)</P><H4 id="5-2-verify-defender-extension-provisioning" id="toc-hId--1594954521">5.2 Verify Defender extension provisioning</H4><PRE><CODE>az k8s-extension show \
-<SPAN class="">-name microsoft.azuredefender.kubernetes \</SPAN> -<SPAN class="">-cluster-type connectedClusters \</SPAN> -<SPAN class="">-cluster-name <cluster-name> \</SPAN> -<SPAN class="">-resource-group <resource-group> \</SPAN> -<SPAN class="">-query provisioningState</SPAN>
</CODE></PRE><P>The expected output is <CODE>Succeeded</CODE>. (Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">Verify Defender for Containers on Arc-enabled Kubernetes</A>)</P><H4 id="5-3-verify-sensor-pods" id="toc-hId--1791468026">5.3 Verify sensor pods</H4><PRE><CODE>kubectl <SPAN class="">get</SPAN> pods -n kube-<SPAN class="">system</SPAN> -l app=microsoft-defender
<SPAN class=""># If you don’t see anything in kube-system, also check the mdc namespace:</SPAN>
kubectl <SPAN class="">get</SPAN> ds -n mdc
kubectl <SPAN class="">get</SPAN> pods -n mdc</CODE></PRE><P>This is the simplest “is the sensor deployed?” check. If the DaemonSet exists and the pods are <CODE>Running</CODE>, you’re in good shape.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="defender-daemonsets.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368111iC3A48CB4F95070E2/image-size/large?v=v2&px=999" role="button" title="defender-daemonsets.png" alt="defender-daemonsets.png" /></span></P><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">Verify Defender for Containers on Arc-enabled Kubernetes</A>)</P><H4 id="5-4-verify-in-the-portal" id="toc-hId--1987981531">5.4 Verify in the portal</H4><P>This is the “did Azure actually receive the signals?” check.</P><P>After you’ve deployed the Defender extension and the sensor is running, go to <STRONG>Microsoft Defender for Cloud</STRONG> and look at <STRONG>Security alerts</STRONG> (or the Alerts view in the Defender for Cloud experience). If you just ran the simulator (next step), this is where you’ll see the resulting alerts.</P><P>It can take a bit of time (think minutes, not seconds) for the cluster and alerts to show up after onboarding. (Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">Verify Defender for Containers on Arc-enabled Kubernetes</A>)</P><H4 id="5-5-optional-prove-runtime-detection-by-simulating-alerts" id="toc-hId-2110472260">5.5 (Optional) Prove runtime detection by simulating alerts</H4><P>If I want hard proof that the sensor-backed detections are flowing end-to-end, I use Microsoft’s Kubernetes alerts simulation tool.</P><P>It has two prerequisites that matter in practice:</P><UL><LI>Defender for Containers is enabled and the Defender sensor is deployed.</LI><LI>I have admin permissions on the cluster.</LI></UL><P>Then I download and run the simulator:</P><PRE><CODE>curl -O http<SPAN class="">s:</SPAN>//raw.githubusercontent.<SPAN class="">com</SPAN>/microsoft/Defender-<SPAN class="">for</SPAN>-Cloud-Attack-Simulation/refs/heads/main/simulation.<SPAN class="">py</SPAN>
<SPAN class="">python</SPAN> simulation.<SPAN class="">py</SPAN>
</CODE></PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="run-simulation-alerts.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368112iC3515E0A16A305FC/image-size/large?v=v2&px=999" role="button" title="run-simulation-alerts.png" alt="run-simulation-alerts.png" /></span></P><P>After it runs, I go back to Defender for Cloud and look at the alerts that were generated:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="defender-alerts-simulation.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368113i931D880C4A9ABCFE/image-size/large?v=v2&px=999" role="button" title="defender-alerts-simulation.png" alt="defender-alerts-simulation.png" /></span></P><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/alerts-containers#kubernetes-alerts-simulation-tool" target="_blank" rel="noopener nofollow noreferrer">Kubernetes alerts — Kubernetes alerts simulation tool</A>)</P><H4 id="5-6-inspect-the-alert-details-example-binary-drift-" id="toc-hId-2082142446">5.6 Inspect the alert details (example: binary drift)</H4><P>To make this feel real (and to sanity-check what Defender is actually flagging), I open one of the generated alerts and look at the <STRONG>Alert details</STRONG> pane. For example, the “A drift binary detected executing in the container” alert includes fields like the <STRONG>suspicious process path</STRONG>, <STRONG>command line</STRONG>, <STRONG>parent process</STRONG>, and the <STRONG>affected Arc-enabled Kubernetes resource</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="details-drift-binary.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368114i0C069D1D3E3DB66D/image-size/large?v=v2&px=999" role="button" title="details-drift-binary.png" alt="details-drift-binary.png" /></span></P><H3 id="step-6-troubleshooting-the-short-list-" id="toc-hId--2115935348">Step 6 — Troubleshooting (the short list)</H3><H4 id="6-1-if-an-extension-is-stuck-check-egress-first" id="toc-hId-1689115436">6.1 If an extension is stuck, check egress first</H4><UL><LI>Arc-required outbound URLs: (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/network-requirements" target="_blank" rel="noopener nofollow noreferrer">Azure Arc-enabled Kubernetes network requirements</A>)</LI><LI>Defender-required outbound endpoint (<CODE>*.cloud.defender.microsoft.com:443</CODE>) (Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-portal" target="_blank" rel="noopener nofollow noreferrer">Enable Defender for Containers on Arc-enabled Kubernetes (portal)</A>)</LI></UL><H4 id="6-2-if-things-drift-over-time" id="toc-hId-1492601931">6.2 If things drift over time</H4><P>The Arc extensions doc notes that if Arc agents don’t have network connectivity for an extended period, an extension can transition to <CODE>Failed</CODE>, and you may need to recreate the extension. (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/extensions" target="_blank" rel="noopener nofollow noreferrer">Deploy and manage Arc-enabled Kubernetes extensions</A>)</P><HR /><H2 id="closing-thoughts" id="toc-hId-1882894440">Closing thoughts</H2><P>If you’re running Kubernetes outside AKS, it’s easy to end up with fragmented security tooling. The Arc + Defender for Containers pattern is one of the cleaner ways I’ve found to bring:</P><UL><LI>centralized visibility,</LI><LI>actionable runtime alerts,</LI><LI>and runtime security signals</LI></UL><P>into a hybrid Kubernetes estate—without replatforming.</P><P>In future posts, I’ll explore what else we can do with <STRONG>Kyma + Azure Arc + Azure</STRONG> beyond Defender for Containers (observability, more security patterns, etc.).</P><HR /><H2 id="references-microsoft-learn-" id="toc-hId-1686380935">References (Microsoft Learn)</H2><UL><LI><A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/overview" target="_blank" rel="noopener nofollow noreferrer">Azure Arc-enabled Kubernetes overview</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/network-requirements" target="_blank" rel="noopener nofollow noreferrer">Azure Arc-enabled Kubernetes network requirements</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/quickstart-connect-cluster" target="_blank" rel="noopener nofollow noreferrer">Quickstart: Connect an existing Kubernetes cluster to Azure Arc</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/extensions" target="_blank" rel="noopener nofollow noreferrer">Deploy and manage Arc-enabled Kubernetes extensions</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-portal" target="_blank" rel="noopener nofollow noreferrer">Enable Defender for Containers on Arc-enabled Kubernetes (portal)</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-programmatically" target="_blank" rel="noopener nofollow noreferrer">Deploy Defender for Containers on Arc-enabled Kubernetes (programmatic)</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">Verify Defender for Containers on Arc-enabled Kubernetes</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-architecture" target="_blank" rel="noopener nofollow noreferrer">Defender for Containers architecture</A></LI></UL>2026-02-02T15:52:32.766000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/custom-domain-service-in-sap-btp-build-work-zone-standard-edition/ba-p/14314511Custom Domain Service in SAP BTP Build Work Zone (Standard Edition)2026-02-03T06:12:27.191000+01:00RohitGerahttps://community.sap.com/t5/user/viewprofilepage/user-id/7607<P>Hello Everyone,</P><P>After analyzing and successfully implementing <STRONG>Custom Domain Service</STRONG> in <STRONG>SAP Build Work Zone, Standard Edition</STRONG>, I’m writing this blog to share my learnings. This post explains the <STRONG>concept of Custom Domain Service in SAP BTP</STRONG> and provides <STRONG>end-to-end steps</STRONG> to configure and use it with SAP Build Work Zone.</P><P>This blog will help you get started with <STRONG>SAP Custom Domain Service</STRONG> in <STRONG>SAP BTP Build Work Zone (Standard Edition)</STRONG>.</P><P> </P><H2 id="toc-hId-1788661122">Business Requirement</H2><P>Our client required the use of a <STRONG>custom (client-specific) domain</STRONG> instead of the <STRONG>SAP standard domain</STRONG>.</P><P>By default, when accessing an SAP Build Work Zone site, the URL looks like this:</P><PRE><CODE>https://<SubAccount>.launchpad.cfapps.<DataCenter>.hana.ondemand.com/site/<site-alias>#Shell-home</CODE></PRE><P>(Here, we are using <STRONG>SAP Build Work Zone – Standard Edition</STRONG>.). We can use it for advanced edition too.</P><P>The requirement was to replace this with a <STRONG>client-friendly URL</STRONG>, for example:</P><PRE><CODE>https://abc.com
OR
https://abcservices.abc.com</CODE></PRE><P>We initially tried redirecting traffic from<BR /><CODE><A href="https://abcservices.abc.com" target="_blank" rel="noopener nofollow noreferrer">https://abcservices.abc.com</A></CODE> to the SAP BTP Work Zone URL.<BR />However, this approach didn’t meet the requirement because:</P><UL><LI><P>Network-level redirection works, but</P></LI><LI><P>The browser address bar changes to the SAP BTP URL,</P></LI><LI><P>The client URL (<CODE><A href="https://abcservices.abc.com" target="_blank" rel="noopener nofollow noreferrer">https://abcservices.abc.com</A></CODE>) is no longer visible.</P></LI></UL><P>To solve this, we implemented <STRONG>SAP Custom Domain Service</STRONG>.</P><P> </P><H2 id="toc-hId-1592147617">Prerequisites</H2><P>Before starting the configuration, ensure the following prerequisites are met:</P><H3 id="toc-hId-1524716831">1. Enable Custom Domain Service</H3><P>Add <STRONG>Custom Domain Service</STRONG> to your <STRONG>subaccount</STRONG> with the <STRONG>Standard</STRONG> plan.</P><BLOCKQUOTE><P>Note: Another plan exists but is deprecated at the time of writing this blog.</P></BLOCKQUOTE><P><STRONG>SAP Help Document:</STRONG><BR /><A href="https://help.sap.com/docs/build-work-zone-standard-edition/sap-build-work-zone-standard-edition/setting-up-custom-domain" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/build-work-zone-standard-edition/sap-build-work-zone-standard-edition/setting-up-custom-domain</A></P><P>Below is the screen shot from sub account for reference:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RohitGera_0-1769766584396.png" style="width: 680px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367327iF67382972CABCD82/image-dimensions/680x128?v=v2" width="680" height="128" role="button" title="RohitGera_0-1769766584396.png" alt="RohitGera_0-1769766584396.png" /></span></P><P>Please note SAP will charge based on how many certificate you have uploaded in the Cusotm Domain Manager irrespective of Number of Custom Domain.</P><P> </P><H3 id="toc-hId-1328203326">2. Finalize Reserved and Custom Domains</H3><P>Finalize your <STRONG>reserved domain</STRONG> and <STRONG>custom domains</STRONG> in advance.</P><P><STRONG>Do’s:</STRONG></P><UL><LI><P>Do not rush this step. </P></LI><LI><P>Finalize domains separately for <STRONG>Non-Prod (DEV & QA)</STRONG> and <STRONG>Prod</STRONG> subaccounts.</P></LI><LI><P>Changing domains later can be complex and time-consuming.</P></LI></UL><P><STRONG>Dont’s:</STRONG></P><UL><LI>Do not signed the CSR form Trusted CA authority because it involved cost and time. </LI><LI>If possible dont configure the Non Prod and Prod Custom domain in single custom domain manager because it will mess the things. Try to keep the Custom Domain Service for Production seperately.</LI><LI>Dont configure the Custom Domain Manager for Production untill you get success in the Non Prod environment.</LI><LI> </LI></UL><H3 id="toc-hId-1131689821">3. Runtime Destination Naming</H3><P>Ensure the <STRONG>runtime destination names</STRONG> are finalized as per project standards, as these are referenced by applications.</P><P> </P><H2 id="toc-hId-806093597">Implementation Steps</H2><H3 id="toc-hId-738662811">Step 1: Define a Default Site</H3><P>A <STRONG>default site</STRONG> is the site that opens when no site ID is specified in the URL.</P><P>Key points:</P><UL><LI><P>A default site is configured <STRONG>per custom domain</STRONG>.</P></LI><LI><P>It does <STRONG>not</STRONG> affect all domains in the subaccount.</P></LI><LI><P>A custom domain can be mapped to only <STRONG>one entry point</STRONG>, which is why it’s mapped to the <STRONG>default site</STRONG> and not to a specific site. Below is the screen shot of the default site:</P></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RohitGera_1-1769767006507.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367339i272B63F06D9A7C11/image-size/medium?v=v2&px=400" role="button" title="RohitGera_1-1769767006507.png" alt="RohitGera_1-1769767006507.png" /></span></P><P> </P><P> </P><H3 id="toc-hId-542149306">Step 2: Identify the Reserved Domain</H3><P>The <STRONG>reserved domain</STRONG> should be the <STRONG>parent domain</STRONG>, for example:</P><PRE><CODE>abc.com or abcservices.abc.com</CODE></PRE><P>The <STRONG>custom domain</STRONG> is created using the reserved domain, such as:</P><PRE><CODE>wz.abcservices.abc.com</CODE></PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RohitGera_2-1769767132424.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367340i0B87C53C0FE7B467/image-size/medium?v=v2&px=400" role="button" title="RohitGera_2-1769767132424.png" alt="RohitGera_2-1769767132424.png" /></span></P><P> </P><H3 id="toc-hId-345635801">Step 3: Define Custom Domains for Applications</H3><P>Create custom domains for the following applications as needed:</P><OL><LI><P><STRONG>SAP Build Work Zone</STRONG></P></LI><LI><P><STRONG>On-Premise Backend Systems</STRONG> (S/4HANA, CRM, BW, etc.) – <EM>Optional</EM></P></LI><LI><P><STRONG>Identity Authentication Service (IAS)</STRONG> – <EM>Optional</EM></P></LI></OL><BLOCKQUOTE><P>IAS works with the SAP standard domain by default. A custom domain for IAS is optional.</P></BLOCKQUOTE><H4 id="toc-hId-278205015">IAS Considerations</H4><P>In our case, we did <STRONG>not</STRONG> configure a custom domain for IAS because:</P><UL><LI><P>IAS requires a separate CSR and CA-signed certificate.</P></LI><LI><P>This involves additional cost.</P></LI><LI><P>Wildcard certificates used in Custom Domain Manager <STRONG>do not work for IAS</STRONG>.</P></LI></UL><P><STRONG>Reference Documents:</STRONG></P><UL><LI><P><A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/use-custom-domain-in-identity-authentication" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/use-custom-domain-in-identity-authentication</A></P></LI><LI><P><A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/regional-availability?version=Cloud" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/regional-availability?version=Cloud</A></P></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RohitGera_3-1769767311802.png" style="width: 794px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367342i55A7F4ECD9A52254/image-dimensions/794x261?v=v2" width="794" height="261" role="button" title="RohitGera_3-1769767311802.png" alt="RohitGera_3-1769767311802.png" /></span></P><P> </P><H3 id="toc-hId--122622578">Step 4: Configure Custom Domain Manager</H3><P>Add the <STRONG>reserved domain</STRONG> and <STRONG>custom domains</STRONG> in <STRONG>Custom Domain Manager</STRONG>.</P><H4 id="toc-hId--612539090">Required Roles:</H4><P>Assign the following roles to the user (Default or Custom IAS):</P><UL><LI><P><STRONG>Custom Domain Administrator</STRONG> – Manage configurations</P></LI><LI><P><STRONG>Custom Domain Viewer</STRONG> – View configurations</P></LI></UL><P>Once roles are assigned, you can access <STRONG>Custom Domain Manager</STRONG> from the subaccount.</P><H3 id="toc-hId--515649588"> </H3><H3 id="toc-hId--712163093">Step 5: Create SaaS Routes</H3><P>Create a <STRONG>SaaS route</STRONG> for each custom domain.<BR />These routes act as redirection endpoints for:</P><UL><LI><P>SAP Build Work Zone</P></LI><LI><P>Backend systems (if applicable)</P></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RohitGera_4-1769767538312.png" style="width: 751px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367343i212651F7AB4CCB1D/image-dimensions/751x252?v=v2" width="751" height="252" role="button" title="RohitGera_4-1769767538312.png" alt="RohitGera_4-1769767538312.png" /></span></P><P> </P><H3 id="toc-hId--908676598">Step 6: Create TLS Configuration</H3><P>Create a <STRONG>TLS configuration</STRONG> for secure communication.</P><P><STRONG>SAP Help Document:</STRONG><BR /><A href="https://help.sap.com/docs/custom-domain/custom-domain-manager/manage-tls-configurations" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/custom-domain/custom-domain-manager/manage-tls-configurations</A></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RohitGera_0-1770095743175.png" style="width: 721px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368389iD08C164C486F3758/image-dimensions/721x292?v=v2" width="721" height="292" role="button" title="RohitGera_0-1770095743175.png" alt="RohitGera_0-1770095743175.png" /></span></P><H3 id="toc-hId--1105190103">Step 7: Generate CSR (Certificate Signing Request)</H3><P>Generate a <STRONG>CSR</STRONG> from Custom Domain Manager and get it signed by a <STRONG>trusted Certificate Authority (CA)</STRONG>.</P><H4 id="toc-hId--1595106615">CSR Generation Options</H4><P><STRONG>Option A: Individual Certificates</STRONG><BR />Generate one CSR per domain, for example:</P><UL><LI><P><CODE>s4.abcservices.abc.com</CODE></P></LI><LI><P><CODE>crm.abcservices.abc.com</CODE></P></LI><LI><P><CODE>bw.abcservices.abc.com</CODE></P></LI></UL><P><STRONG>Option B: Wildcard Certificate</STRONG><BR />Generate a wildcard CSR:</P><PRE><CODE>CN: *.abcservices.abc.com
SAN: *.abcservices.abc.com, abcservices.abc.com</CODE></PRE><H4 id="toc-hId--1791620120">Certificate Signing Guidelines</H4><UL><LI><P><STRONG>Internal network</STRONG> → Internal CA is acceptable and all the applicaiton will work.</P></LI><LI><P><STRONG>Public access</STRONG> → Internal CA will cause browser warnings as below and navigation to the backend </P></LI><LI><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RohitGera_0-1770289776904.png" style="width: 730px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369147iD0C82EE0588CE3CF/image-dimensions/730x301?v=v2" width="730" height="301" role="button" title="RohitGera_0-1770289776904.png" alt="RohitGera_0-1770289776904.png" /></span></P><P> </P><P>Use a trusted CA like <STRONG>DigiCert </STRONG>if you want to access the custom domain publically.</P><P> </P></LI></UL><P><STRONG>Important Notes:</STRONG></P><UL><LI><P>Verify <STRONG>CN and SAN</STRONG> before submitting CSR.</P></LI><LI><P>Certificates are valid <STRONG>only for the Custom Domain Manager instance</STRONG> from which the CSR was generated.</P></LI><LI><P>Non-Prod certificates cannot be reused in Prod.</P></LI><LI>We have generated the Wild Card Certificate for Production and Single Certificate (Included all SAN) for Non Prod System. Below is the Certificate Screen shot:</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RohitGera_1-1770095804785.png" style="width: 729px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368390iF1D61E742E487AE9/image-dimensions/729x279?v=v2" width="729" height="279" role="button" title="RohitGera_1-1770095804785.png" alt="RohitGera_1-1770095804785.png" /></span></P><P> </P><P><STRONG>DigiCert Reference:</STRONG><BR /><A href="https://docs.digicert.com/en/certcentral/manage-certificates/reissue-an-ssl-tls-certificate.html" target="_blank" rel="noopener nofollow noreferrer">https://docs.digicert.com/en/certcentral/manage-certificates/reissue-an-ssl-tls-certificate.html</A></P><H3 id="toc-hId--1694730618"> </H3><H3 id="toc-hId--1891244123">(Optional) IAS CSR Generation</H3><P>Wildcard certificates <STRONG>do not work</STRONG> for IAS.<BR />A separate CSR and certificate are required.</P><BLOCKQUOTE><P>We skipped IAS custom domain due to additional cost and renewal overhead.</P></BLOCKQUOTE><H3 id="toc-hId--1919573937"> </H3><H3 id="toc-hId--2116087442">Step 8: Upload and Activate Certificate</H3><P>Once signed, upload the certificate to <STRONG>Custom Domain Manager</STRONG>.</P><P>The certificate package includes:</P><UL><LI><P>Actual certificate</P></LI><LI><P>Intermediate certificate</P></LI><LI><P>Root certificate</P></LI></UL><H4 id="toc-hId-1688963342">Certificate Chain Format</H4><PRE><CODE>Actual Certificate
+ Intermediate Certificate
+ Root Certificate</CODE></PRE><P><STRONG>Tips:</STRONG></P><UL><LI><P>Combine the full chain in a text file.</P></LI><LI><P>Remove extra spaces or blank lines.</P></LI><LI><P>Activate the certificate after upload.</P></LI></UL><P>Once activated:</P><UL><LI><P>Certificate expiry days are visible.</P></LI><LI><P>Renewal can be planned proactively.</P></LI></UL><P> </P><H2 id="toc-hId-2079255851">Final Result</H2><P>After successful activation, SAP Build Work Zone is accessible using the custom domain:</P><PRE><CODE>https://wz.abccompany.company.com</CODE></PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RohitGera_7-1769767998071.png" style="width: 744px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367348iBDC5C3EF8C1F5AB0/image-dimensions/744x388?v=v2" width="744" height="388" role="button" title="RohitGera_7-1769767998071.png" alt="RohitGera_7-1769767998071.png" /></span></P><P> </P><P><STRONG>Errors that can occur: </STRONG>After all the configuration, If you stuck in the IAS authentication while accessing the work zone and getting the below error then add the custom domain in the IAS application:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RohitGera_1-1770290146587.png" style="width: 620px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369150iC32C59E05990BEF7/image-dimensions/620x245?v=v2" width="620" height="245" role="button" title="RohitGera_1-1770290146587.png" alt="RohitGera_1-1770290146587.png" /></span></P><P> </P><P>Add you custom domain in the following path in the IAS if not came automatically:</P><P>Login to IAS -> Applications & Resources -> Applications -> Select the Application of Build Work Zone -> Single Sign On -> OpenID Connet Configuraiton and then in the <STRONG>Redirect URIs </STRONG>and<STRONG>Post Logout Redirect URIs </STRONG>section add the URl as <STRONG>https://*.abcservices.abc.ae/** </STRONG>(Your custom domain so that IAS will trust this domain)</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RohitGera_2-1770290505147.png" style="width: 699px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369153i9EA8DF7B7FA4BAC4/image-dimensions/699x365?v=v2" width="699" height="365" role="button" title="RohitGera_2-1770290505147.png" alt="RohitGera_2-1770290505147.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RohitGera_4-1770290594863.png" style="width: 700px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369156i336613B50C700C5C/image-dimensions/700x366?v=v2" width="700" height="366" role="button" title="RohitGera_4-1770290594863.png" alt="RohitGera_4-1770290594863.png" /></span></P><P> </P><H2 id="toc-hId-1882742346">Conclusion</H2><P>I hope this blog helps you understand the <STRONG>Custom Domain Service</STRONG> concept and implement it successfully in <STRONG>SAP Build Work Zone</STRONG> projects.</P><P>Happy learning and implementing! <span class="lia-unicode-emoji" title=":rocket:">🚀</span></P><P> </P><P><STRONG>Regards,</STRONG><BR /><STRONG>Rohit Gera</STRONG></P>2026-02-03T06:12:27.191000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/q4-2025-quarterly-release-highlights-sap-btp-security-and-identity-amp/ba-p/14324273Q4 2025 Quarterly Release Highlights: SAP BTP Security and Identity & Access Management2026-02-10T09:00:00.021000+01:00RegineSchimmerhttps://community.sap.com/t5/user/viewprofilepage/user-id/8286<P><SPAN>In the last quarter of 2025, we release a number of new features, as well as the SAP Key Management Service.</SPAN></P><P><SPAN>Want the full overview for SAP Cloud Identity Services? You’ll find a list of all new feature announcements for SAP Cloud Identity Services in the <A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/what-s-new-for-identity-authentication" target="_blank" rel="noopener noreferrer">SAP Cloud Identity Services Release Notes</A> on the SAP Help Portal. </SPAN></P><H2 id="toc-hId-1789581948"><SPAN>SAP Cloud Identity Services: Use Data Control Language (DCL) to Define Authorization Policies</SPAN></H2><P><SPAN>Developers define authorization policies in SAP Cloud Identity Services, using an SQL-like language - the data control language (DCL). Administrators can restrict base policies and combine authorization policies into a new authorization policy. For more details, please check the <A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/data-control-language-dcl" target="_blank" rel="noopener noreferrer">SAP Help Portal</A>. </SPAN></P><H2 id="toc-hId-1593068443"><SPAN>SAP Key Management Service</SPAN></H2><P><SPAN>We released the <A href="https://help.sap.com/docs/SAP_Key_Management_Service?locale=en-US" target="_blank" rel="noopener noreferrer"><STRONG>SAP Key Management Service (KMS)</STRONG></A>, which puts customers in control of their data across SAP cloud services and products. By managing their own encryption keys, customers decide exactly who can access their information. </SPAN></P><P><SPAN>With SAP KMS</SPAN><SPAN>, data remains inaccessible to any external party, including SAP, government agencies, or legal authorities, unless the customer explicitly authorizes access. The service enables customers to securely create, manage, and control the encryption keys used to protect their data, and helps ensure that encryption and decryption can occur only with their approval. </SPAN></P><H2 id="toc-hId-1396554938"><SPAN>SAP Cryptographic Library</SPAN></H2><P><SPAN>The latest <STRONG>SAP Cryptographic Library</STRONG> release (version 8.6) supports quantum-safe cryptography and contains updated compliance certifications. It introduces a quantum-safe TLS 1.3 handshake using a hybrid key exchange that protects encrypted communications even against future quantum attacks. </SPAN></P><P><SPAN>In addition, SAP’s FIPS crypto kernel has achieved FIPS 140-3 certification, meeting strict security requirements for regulated industries. Together, these enhancements help customers future-proof their data protection while maintaining compliance. For more information, check our latest <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/new-version-8-6-of-the-sap-cryptographic-library-with-quantum-safe/ba-p/14280039" target="_blank">blog </A> as well as release notes <A href="https://me.sap.com/notes/3685428" target="_blank" rel="noopener noreferrer">3685428 - Fixes and features in CommonCryptoLib 8.6.2</A> and <A href="https://me.sap.com/notes/1848999" target="_blank" rel="noopener noreferrer">1848999 - Central Note for CommonCryptoLib 8 (SAPCRYPTOLIB)</A>.</SPAN></P><H2 id="toc-hId-1200041433"><SPAN>Application Vulnerability Report for SAP BTP</SPAN></H2><P><SPAN>Frequent security issues in open-source components endanger business data in applications. Use the application vulnerability report to detect and remediate any vulnerabilities in your SAP BTP landscape. The application vulnerability report focuses on detecting publicly-known security vulnerabilities based on Common Vulnerabilities and Exposures (CVEs). It's crucial to solve such vulnerabilities quickly as attackers are generally aware of them and might try to break into vulnerable systems. Check our <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/beta-version-of-application-vulnerability-report-for-sap-btp-now-available/ba-p/14283839" target="_blank">blog</A> for details.</SPAN></P><H2 id="toc-hId-1003527928"><SPAN>Stay connected</SPAN></H2><P><SPAN>Want to stay up to date on our services? Join our <A href="https://pages.community.sap.com/topics/btp-security" target="_blank" rel="noopener noreferrer">SAP BTP Security</A> and <A href="https://pages.community.sap.com/topics/cloud-identity-services" target="_blank" rel="noopener noreferrer">SAP Cloud Identity Services</A> communities! </SPAN></P><P><SPAN> </SPAN></P><P> </P>2026-02-10T09:00:00.021000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/ui-for-the-btp-application-vulnerability-report/ba-p/14325818UI for the BTP Application Vulnerability Report2026-02-10T22:42:33.106000+01:00WouterLemairehttps://community.sap.com/t5/user/viewprofilepage/user-id/9863<P><SPAN>SAP recently introduced the Application Vulnerability Report for Cloud Foundry applications on BTP. It is a tool that scans your deployed applications for known vulnerabilities and exposes the findings through an API. If you haven't seen it yet, check out the official announcement: </SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-application-vulnerability-report-for-cloudfoundry-applications/ba-p/14281684" target="_blank">https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-application-vulnerability-report-for-cloudfoundry-applications/ba-p/14281684</A></P><P><SPAN>The API is great, but what was missing is an interface to browse, search, filter, sort and export those findings. So I built one. In this blog post I'll walk you through the open-source UI I created on top of the BTP Application Vulnerability Report API.</SPAN></P><H2 id="toc-hId-1789617324"> </H2><H2 id="toc-hId-1593103819"><SPAN>Problem</SPAN></H2><P><SPAN>The Application Vulnerability Report API provides: vulnerability descriptions, severity levels, affected packages, CVE identifiers and the full organizational context (global account, sub-account, space, org). However, consuming a raw API to get an overview of your security posture is not practical for most teams. You need to be able to:</SPAN></P><UL><LI><SPAN>Quickly scan through all findings at a glance</SPAN></LI><LI><SPAN>Sort by severity, application name or date to prioritize remediation</SPAN></LI><LI><SPAN>Filter by sub-account, space, organization or any other column</SPAN></LI><LI><SPAN>Search across all findings with a free-text search</SPAN></LI><LI><SPAN>Export the full report to Excel for offline analysis or sharing with stakeholders</SPAN></LI></UL><H2 id="toc-hId-1396590314"> </H2><H2 id="toc-hId-1200076809"><SPAN>Solution</SPAN></H2><P><SPAN>That's what I tried to solve by adding this UI: a full SAPUI5 frontend backed by a CAP Node.js service that proxies the BTP API, deployed via the managed approuter on BTP. The CAP layer might be a bit overkill at this point but it offers flexibility for future improvements. </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WouterLemaire_1-1770759652731.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371192i9CC68784C972E22C/image-size/medium?v=v2&px=400" role="button" title="WouterLemaire_1-1770759652731.png" alt="WouterLemaire_1-1770759652731.png" /></span></P><P><SPAN>The first version comes with the following features:</SPAN></P><UL><LI><STRONG>Sorting</STRONG>: Click column headers to sort findings</LI><LI><STRONG>Filtering</STRONG>: Right-click cells or use column menus to filter by severity, application, sub-account, space or any field</LI><LI><STRONG>Free-Text Search</STRONG>: Search across all finding properties using CVE numbers, package names or application names</LI><LI><STRONG>Export to Excel</STRONG>: Generate formatted .xlsx files with all 15 fields including recommendations, dates, finding IDs and CVSS scores</LI><LI><STRONG>Severity Indicators</STRONG>: Color-coded findings (Critical/High in red, Moderate in orange, Low in blue) for instant visual prioritization</LI></UL><H2 id="toc-hId-1003563304"> </H2><H2 id="toc-hId-807049799"><SPAN>Architecture Overview</SPAN></H2><P><SPAN>The project consists of two parts:</SPAN></P><UL><LI><SPAN>CAP Node.js Backend: A lightweight OData V4 service that acts as a proxy to the BTP Application Vulnerability Report API. It connects to the external API via a BTP Destination with OAuth2 authentication. The CAP service defines the Findings entity as a projection on the external service model and uses api.run(req.query) to forward OData queries. At this point, the only value of having CAP is for merging some array fields into one single column:</SPAN></LI></UL><P><SPAN> </SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WouterLemaire_2-1770759678419.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371193i7DE488C967D80D91/image-size/medium?v=v2&px=400" role="button" title="WouterLemaire_2-1770759678419.png" alt="WouterLemaire_2-1770759678419.png" /></span></P><P> </P><UL><LI><SPAN>SAPUI5 Frontend: A freestyle UI5 application with a table to show the overview and provide some additional functionalities like sorting, filtering and an export to excel. Now thinking about it, this could’ve been a Fiori Elements app as well. The app is deployed to the HTML5 Application Repository and served via the managed approuter of SAP Build Work Zone.</SPAN></LI></UL><P><SPAN> </SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WouterLemaire_0-1770759606583.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371191iC58C098EB96E4C34/image-size/medium?v=v2&px=400" role="button" title="WouterLemaire_0-1770759606583.png" alt="WouterLemaire_0-1770759606583.png" /></span></P><H2 id="toc-hId-610536294"> </H2><H2 id="toc-hId-414022789"><SPAN>Getting It Up and Running</SPAN></H2><H3 id="toc-hId-346592003"><SPAN>Prerequisites</SPAN></H3><UL><LI><SPAN>Node.js >= 18</SPAN></LI><LI><SPAN>SAP CAP CLI (npm i -g @sap/cds-dk)</SPAN></LI><LI><SPAN>Cloud MTA Build Tool (npm i -g mbt)</SPAN></LI><LI><SPAN>CF CLI with the MTA plugin</SPAN></LI><LI><SPAN>A BTP subaccount with the Application Vulnerability Report service enabled</SPAN></LI></UL><H3 id="toc-hId-150078498"><SPAN>Step 1: Clone the Repository</SPAN></H3><P><SPAN>git clone <A href="https://github.com/lemaiwo/btp-application-vulnerability-report-ui.git" target="_blank" rel="noopener nofollow noreferrer">https://github.com/lemaiwo/btp-application-vulnerability-report-ui.git</A><BR />cd btp-application-vulnerability-report-ui<BR />npm install</SPAN></P><H3 id="toc-hId--121666376"><SPAN>Step 2: Create the BTP Destination</SPAN></H3><P><SPAN>In your BTP subaccount, create a destination named "BTPVulnerabilityReport" that points to the Application Vulnerability Report API. Configure it with OAuth2ClientCredentials authentication using the credentials from your service key.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WouterLemaire_3-1770759699130.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371194iD5BB0EBDBC442078/image-size/medium?v=v2&px=400" role="button" title="WouterLemaire_3-1770759699130.png" alt="WouterLemaire_3-1770759699130.png" /></span></P><H3 id="toc-hId--318179881"><SPAN>Step 3: Build and Deploy</SPAN></H3><P><SPAN>mbt build -t gen --mtar btpvulnerabilityreport.mtar<BR />cf deploy gen/btpvulnerabilityreport.mtar</SPAN></P><P><SPAN>The MTA deployment creates:</SPAN></P><UL><LI><SPAN>A CAP Node.js backend application</SPAN></LI><LI><SPAN>An XSUAA service instance for authentication</SPAN></LI><LI><SPAN>A Destination service instance (with HTML5 runtime enabled)</SPAN></LI><LI><SPAN>An HTML5 Application Repository entry for the UI5 app</SPAN></LI></UL><H3 id="toc-hId--514693386"><SPAN>Step 4: Access the App</SPAN></H3><P><SPAN>The application is deployed using the managed approuter pattern. You can access it through SAP Build Work Zone by adding it as an application tile. The Fiori Launchpad integration is pre-configured with the semantic object "VulnerabilityReport" and action "display".</SPAN></P><H3 id="toc-hId--711206891"><SPAN>Local Development</SPAN></H3><P><SPAN>For local development, run cds watch from the project root (not ui5 serve from the app folder). The cds-plugin-ui5 plugin serves the UI5 app directly from the CAP server. To test against the real BTP API locally, use the hybrid profile: cds watch --profile hybrid after binding the destination service with cds bind.</SPAN></P><H3 id="toc-hId--907720396"><SPAN>No Database Required</SPAN></H3><P><SPAN>The application does not use a database. All data comes directly from the BTP API in real-time. This keeps the architecture simple and ensures you always see the latest findings without any synchronization concerns.</SPAN></P><H2 id="toc-hId--810830894"> </H2><H2 id="toc-hId--1007344399"><SPAN>What's Next?</SPAN></H2><P><SPAN>The current version uses the managed approuter of SAP Build Work Zone for serving the application. I'm considering adding a standalone approuter configuration as an alternative for scenarios where Work Zone is not available or needed.</SPAN></P><P><SPAN>Other ideas for future enhancements include dashboard charts for severity distribution, drill-down to individual finding details and scheduled notifications for new critical findings.</SPAN></P><P><SPAN>Contributions and feedback are welcome! The full source code is available on GitHub:</SPAN></P><P><SPAN><A href="https://github.com/lemaiwo/btp-application-vulnerability-report-ui" target="_blank" rel="noopener nofollow noreferrer">https://github.com/lemaiwo/btp-application-vulnerability-report-ui</A></SPAN></P><H2 id="toc-hId--1203857904"> </H2><H2 id="toc-hId--1400371409"><SPAN>References</SPAN></H2><UL><LI><SPAN>Introducing Application Vulnerability Report for CloudFoundry Applications (SAP Community Blog): <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-application-vulnerability-report-for-cloudfoundry-applications/ba-p/14281684" target="_blank">https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-application-vulnerability-report-for-cloudfoundry-applications/ba-p/14281684</A></SPAN></LI><LI><SPAN>GitHub Repository: <A href="https://github.com/lemaiwo/btp-application-vulnerability-report-ui" target="_blank" rel="noopener nofollow noreferrer">https://github.com/lemaiwo/btp-application-vulnerability-report-ui</A></SPAN></LI></UL>2026-02-10T22:42:33.106000+01:00https://community.sap.com/t5/integration-blog-posts/the-hidden-threat-to-your-clean-core-variant-governance-in-s-4hana/ba-p/14325710The Hidden Threat to Your Clean Core: Variant Governance in S/4HANA2026-02-11T21:50:33.739000+01:00Atul_Joshi85https://community.sap.com/t5/user/viewprofilepage/user-id/2274193<H1 id="toc-hId-1660533636"> </H1><P><STRONG>By Atul Joshi — Lead SAP Architect, Utilities & Clean Core Specialist</STRONG></P><H1 id="toc-hId-1464020131">Introduction</H1><P>Organizations invest millions in S/4HANA transformations, aiming for a Clean Core, agile upgrades, and a future‑proof digital landscape. We move custom code to BTP, rationalize interfaces, and modernize processes.</P><P>Yet one silent, often overlooked threat can undermine all of that work: <STRONG>uncontrolled variant changes in production batch jobs.</STRONG></P><P>A single unauthorized variant change can cause incorrect billing, incomplete financial postings, or regulatory reporting issues. These failures are not technical—they are governance failures. And they can compromise Clean Core integrity even when no Z‑code exists.</P><H1 id="toc-hId-1267506626">Why Variant Governance Fails in Utilities and S/4HANA Landscapes</H1><H2 id="toc-hId-1200075840">1. “Temporary Fix” Syndrome</H2><P>A user changes a variant “just for today” and forgets to revert it.</P><H2 id="toc-hId-1003562335">2. Lack of Awareness</H2><P>Users do not understand the downstream impact of altering a production variant.</P><H2 id="toc-hId-807048830">3. Over‑Authorization</H2><P>Security roles grant variant maintenance access where only execution is required.</P><P>The result is a silent failure that may not surface until weeks later—after financial cycles close, billing runs complete, or regulatory reports are submitted.</P><H1 id="toc-hId-481452606">A Real‑World Case: The Variant That Broke a Month of Processing</H1><P>A nightly batch report was scheduled using <STRONG>Variant X</STRONG>, configured to process <STRONG>all company codes</STRONG>. It ran successfully for months.</P><P>One day, a well‑meaning user modified Variant X and restricted it to <STRONG>a single company code</STRONG>, assuming it was a temporary adjustment.</P><P>No one noticed.</P><P>For the next month, the batch job processed only that one company code. No dumps, no warnings, no alerts. The issue surfaced only during reconciliation, when the business noticed missing postings across multiple entities.</P><P>By then:</P><UL><LI>Downstream reports were incorrect</LI><LI>Financial data was incomplete</LI><LI>Audit trails were inconsistent</LI><LI>Cleanup required days of effort</LI></UL><P>This was not a technical issue. It was a <STRONG>governance failure</STRONG>—and a perfect example of how a single variant change can undermine Clean Core stability.</P><H1 id="toc-hId-284939101"><STRONG><U>Why This Threatens Clean Core</U></STRONG></H1><P>Clean Core is not only about removing custom code. It is about <STRONG>predictability, stability, and governance</STRONG>.</P><P>A single variant change can:</P><UL><LI>Break standardized processes</LI><LI>Trigger incorrect financial or billing results</LI><LI>Create audit and compliance risks</LI><LI>Force emergency patches</LI><LI>Introduce new technical debt</LI></UL><P>You can have zero Z‑code and still have a “dirty core” if your variants are uncontrolled.</P><H1 id="toc-hId-88425596">My Approach to Variant Hardening</H1><P>To address this risk, I use a three‑layer governance model that protects mission‑critical batch processes. This approach combines technical controls with operational discipline.</P><H2 id="toc-hId-20994810">Layer 1: Protect Variant Flag — First Line of Defense</H2><P>Every production variant should have the <STRONG>Protect Variant</STRONG> flag enabled (SE38 or program RSVARATT).</P><P><STRONG>How it works:</STRONG></P><P>Only the creator or last protector can modify the variant. Others can execute it, but fields become read‑only.</P><P><STRONG>Benefit:</STRONG></P><P>Prevents casual or accidental modifications.</P><P><STRONG>Limitation:</STRONG></P><P>It is a single point of failure—additional layers are required.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Atul_Joshi85_0-1770742846001.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371139i1B9485BE3ADA904F/image-size/medium?v=v2&px=400" role="button" title="Atul_Joshi85_0-1770742846001.png" alt="Atul_Joshi85_0-1770742846001.png" /></span></P><P> </P><H2 id="toc-hId-171735662">Layer 2: SAP Security Authorization — Granular Access Control</H2><P>This is the enterprise‑grade safeguard.</P><P><STRONG>Key object:</STRONG> S_PROGRAM</P><P><STRONG>Key field:</STRONG> P_ACTION</P><P><STRONG>Best practice:</STRONG></P><UL><LI>Business users → SUBMIT only</LI><LI>Variant maintenance (VARIANT) → restricted to a small governance group</LI></UL><P><STRONG>Impact:</STRONG></P><P>Even if someone attempts to unprotect a variant, they cannot save changes without the correct authorization.</P><H2 id="toc-hId--24777843">Layer 3: ABAP Validation — The Final Safety Net</H2><P>For critical programs, embed validation logic inside the ABAP code.</P><P><STRONG>Example:</STRONG></P><P>abap</P><P>AT SELECTION-SCREEN.</P><P> IF sy-batch = 'X'.</P><P> IF s_company_code IS INITIAL.</P><P> MESSAGE 'Company Code is mandatory for batch execution. Job aborted.' TYPE 'A'.</P><P> ENDIF.</P><P> </P><P> IF p_date_from > p_date_to.</P><P> MESSAGE 'Invalid date range. Job aborted.' TYPE 'A'.</P><P> ENDIF.</P><P> ENDIF.</P><P><STRONG>Result:</STRONG></P><P>Even if a variant bypasses the first two layers, the program aborts before processing incorrect data.</P><H1 id="toc-hId-72111659">The Executive Mandate: Variant Governance as a Clean Core Requirement</H1><P>Variant governance must be elevated from a technical detail to a <STRONG>strategic governance priority</STRONG>.</P><P>As architects, we must:</P><UL><LI>Educate business teams</LI><LI>Enforce governance protocols</LI><LI>Treat variant control as part of Clean Core</LI><LI>Elevate this topic to leadership</LI></UL><P>The cost of prevention is minimal compared to the cost of correction.</P><P>By implementing this 3‑layer protocol, organizations can:</P><UL><LI>Protect data integrity</LI><LI>Ensure compliance</LI><LI>Improve operational stability</LI><LI>Safeguard their Clean Core investment</LI></UL><P>This is not just configuration—it is operational excellence.</P><H1 id="toc-hId--124401846">Let’s Discuss</H1><P>What challenges do you face in managing variants in your SAP landscape? Have you experienced a variant‑related incident?</P><P>Share your experiences below—let’s architect better governance together.</P><P> </P>2026-02-11T21:50:33.739000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-xsuaa-security-configuration-comparison-attribute-based-vs/ba-p/14330535SAP BTP XSUAA Security Configuration Comparison: Attribute-Based vs. Authority-Based Approaches2026-02-18T03:27:30.148000+01:00RajeshKPutumbakahttps://community.sap.com/t5/user/viewprofilepage/user-id/2081121<P class="">In SAP Business Technology Platform (BTP) Cloud Foundry applications, configuring <STRONG>XSUAA</STRONG> (Extended Services for User Account and Authentication) via the <STRONG>xs-security.json</STRONG> file is a critical step for secure authentication and authorization.</P><P class="">Sample Application used for this article - "Message Reprocessing Application". This scenario try to cover 2 roles - "ReprocessViewer" and "ReprocessAdministrator".</P><P class="">Two main approaches exist:</P><P class=""> </P><UL><LI><STRONG>Configuration A</STRONG>: Explicit attribute-based – manual mapping and control</LI><LI><STRONG>Configuration B</STRONG>: Authority-based – automatic acceptance of IDP attributes (recommended for most cases)</LI></UL><P> </P><P class="">Understanding the differences helps you balance security, compliance, simplicity, and development speed.</P><H3 id="ember57" id="toc-hId-1919471785">Quick Comparison Table</H3><PRE><CODE>Feature | Config A (Explicit Attributes) | Config B (Authority-Based)
---------------------------------|-----------------------------------------|--------------------------------------------
attributes section | ✅ Present (defines email, etc.) | ❌ Not needed
attribute-references in roles | ✅ Yes (links attributes to roles) | ❌ Not present
authorities array | ❌ Not used | ✅ "$ACCEPT_GRANTED_AUTHORITIES"
oauth2 grant-types | ❌ Uses defaults | ✅ Explicit list (authorization_code + others)
oauth2 autoapprove | ❌ Not set (shows consent screen) | ✅ true (smooth internal login)</CODE></PRE><P class=""><STRONG>Key takeaway from the table</STRONG></P><H3 id="ember59" id="toc-hId-1722958280">Configuration A: Explicit Attribute-Based Approach</H3><P class=""><STRONG>Structure (xs-security.json excerpt):</STRONG></P><P class="">JSON</P><PRE><CODE>{
"xsappname": "my-app-reprocess-v2",
"tenant-mode": "dedicated",
"description": "Message Reprocessing Application - Security Configuration",
"scopes": [
{
"name": "$XSAPPNAME.ReprocessViewer",
"description": "View messages, content, and statistics (read-only access)"
},
{
"name": "$XSAPPNAME.ReprocessAdministrator",
"description": "Full administrative access including reprocess operations and CRUD"
}
],
"attributes": [
{
"name": "email",
"description": "User email address",
"valueType": "string"
}
],
"role-templates": [
{
"name": "ReprocessViewer",
"description": "Read-Only Access - View messages and statistics",
"scope-references": ["$XSAPPNAME.ReprocessViewer"],
"attribute-references": ["email"]
},
{
"name": "ReprocessAdministrator",
"description": "Full Administrative Access - CRUD operations and reprocess actions",
"scope-references": [
"$XSAPPNAME.ReprocessAdministrator",
"$XSAPPNAME.ReprocessViewer"
],
"attribute-references": ["email"]
}
],
"role-collections": [
{
"name": "MessageReprocessViewersRC",
"description": "Message Reprocess Viewers - Read-only access",
"role-template-references": ["$XSAPPNAME.ReprocessViewer"]
},
{
"name": "MessageReprocessAdministratorsRC",
"description": "Message Reprocess Administrators - Full access",
"role-template-references": ["$XSAPPNAME.ReprocessAdministrator"]
}
],
"oauth2-configuration": {
"credential-types": ["binding-secret", "x509"],
"redirect-uris": ["https://*.cfapps.example.com/**", "http://localhost:*/**"],
"token-validity": 3600,
"refresh-token-validity": 86400
}
}</CODE></PRE><P class=""><STRONG>Advantages</STRONG></P><P class=""> </P><UL><LI>Explicit control over exposed attributes</LI><LI>Fine-grained security and compliance</LI><LI>Enables attribute transformation and ABAC</LI></UL><P> </P><P class=""><STRONG>Disadvantages</STRONG></P><P class=""> </P><UL><LI>Higher maintenance</LI><LI>More complex configuration</LI><LI>Less flexible with IDP changes</LI></UL><P> </P><P class=""><STRONG>When to use</STRONG>: Regulated industries (healthcare, finance, government), ABAC needs, multi-tenant SaaS, strict governance.</P><H3 id="ember67" id="toc-hId-1526444775">Configuration B: Authority-Based Approach (Recommended)</H3><P class=""><STRONG>Structure (xs-security.json excerpt):</STRONG></P><P class="">JSON</P><PRE><CODE>{
"xsappname": "my-app-reprocess-v2",
"tenant-mode": "dedicated",
"description": "Message Reprocessing Application - Security Configuration",
"scopes": [ /* same as above */ ],
"role-templates": [ /* same as above, without attribute-references */ ],
"role-collections": [ /* same as above */ ],
"authorities": ["$ACCEPT_GRANTED_AUTHORITIES"],
"oauth2-configuration": {
"grant-types": ["authorization_code", "client_credentials", "refresh_token"],
"credential-types": ["binding-secret", "x509"],
"redirect-uris": ["https://*.cfapps.example.com/**", "http://localhost:*/**"],
"token-validity": 3600,
"refresh-token-validity": 86400,
"autoapprove": true
}
}</CODE></PRE><P class=""><STRONG>Advantages</STRONG></P><P class=""> </P><UL><LI>Simplicity and minimal config</LI><LI>Automatic handling of standard IDP attributes</LI><LI>Lower maintenance, faster development</LI><LI>Seamless with SAP IAS, Azure AD, Okta</LI></UL><P> </P><P class=""><STRONG>Disadvantages</STRONG></P><P class=""> </P><UL><LI>Less granular control (all attributes passed)</LI><LI>Potential over-exposure</LI></UL><P> </P><P class=""><STRONG>When to use</STRONG> (most cases): Standard enterprise apps, RBAC, rapid development, microservices, agile environments.</P><H3 id="ember75" id="toc-hId-1329931270">Deep Dive: Key Differences</H3><P class=""> </P><UL><LI><STRONG>Attributes & attribute-references</STRONG> — Explicit in A, automatic in B via $ACCEPT_GRANTED_AUTHORITIES</LI><LI><STRONG>Authorities</STRONG> — Special directive in B accepts all granted attributes/scopes from trusted IDP</LI><LI><STRONG>OAuth grant-types & autoapprove</STRONG> — Explicit in B for predictability and better UX (no consent screen for internal apps)</LI></UL><P> </P><H3 id="ember77" id="toc-hId-1133417765">JWT Token Examples</H3><P class=""><STRONG>Configuration A (Explicit):</STRONG></P><P class="">JSON</P><PRE><CODE>{
"user_name": "john.doe",
"email": "john.doe@example.com",
"scope": ["my-app-reprocess-v2.ReprocessViewer"],
"xs.user.attributes": { "email": ["john.doe@example.com"] }
}</CODE></PRE><P class=""><STRONG>Configuration B (Automatic):</STRONG></P><P class="">JSON</P><PRE><CODE>{
"user_name": "john.doe",
"email": "john.doe@example.com",
"given_name": "John",
"family_name": "Doe",
"scope": ["my-app-reprocess-v2.ReprocessViewer"],
"xs.user.attributes": { "email": ["john.doe@example.com"], "department": ["Engineering"], "cost_center": ["CC-1234"] }
}</CODE></PRE><H3 id="ember82" id="toc-hId-936904260">Application Code Impact (Examples)</H3><P class=""><STRONG>SAP CAP (Node.js) – Configuration B:</STRONG></P><P class="">JavaScript</P><PRE><CODE>this.before('READ', 'Messages', async (req) => {
const userEmail = req.user.attr.email;
const department = req.user.attr.department; // extra attributes available
// ...
});</CODE></PRE><P class=""><STRONG>Spring Boot (Java) – Configuration B:</STRONG></P><P class="">Java</P><PRE><CODE>String email = token.getAttributeFromClaimAsString("email");
String department = token.getAttributeFromClaimAsString("department");</CODE></PRE><H3 id="ember87" id="toc-hId-740390755">Migration Guide & Troubleshooting</H3><P class="">(Refer to the detailed steps in original content for From A → B and vice versa, plus common issues like missing attributes, invalid grant types, consent screens, token size.)</P><H3 id="ember89" id="toc-hId-543877250">Security & Performance Best Practices</H3><P class=""> </P><UL><LI>Principle of least privilege</LI><LI>Validate JWT properly (@sap/xssec)</LI><LI>Specific redirect URIs (avoid wildcards in prod)</LI><LI>Appropriate token lifetimes</LI><LI>Prefer X.509 in production</LI><LI>Monitor token size (switch to A if >4KB)</LI></UL><P> </P><H3 id="ember91" id="toc-hId-347363745">Recommendations by Use Case</H3><P class="">Use CaseRecommendedRationaleInternal Enterprise AppConfiguration BSimplicity & standard integrationRegulated IndustryConfiguration AExplicit governance & audit trailRapid Prototype/MVPConfiguration BMinimal configAttribute-Based AuthorizationConfiguration ARequired for ABAC</P><P class=""><STRONG>Conclusion</STRONG> For <STRONG>most SAP BTP applications in 2025</STRONG>, go with <STRONG>Configuration B (Authority-Based)</STRONG> — it delivers simplicity, flexibility, and aligns with modern OAuth/OIDC patterns while reducing maintenance.</P><P class="">Only choose <STRONG>Configuration A</STRONG> when you need strict attribute control, custom transformations, or operate in highly regulated environments.</P><P class="">What approach are you using in your SAP BTP projects? Have you migrated between the two? Share your experiences or questions in the comments — happy to discuss architecture or troubleshooting!</P><P class="">#SAPBTP #XSUAA #CloudFoundry #SAPSecurity #Authorization #IdentityManagement #SAPDeveloper</P>2026-02-18T03:27:30.148000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/when-business-asks-for-a-bicycle-don-t-build-a-spaceship/ba-p/14333381When Business Asks for a Bicycle, Don't Build a Spaceship2026-02-21T19:02:14.003000+01:00RajeshKPutumbakahttps://community.sap.com/t5/user/viewprofilepage/user-id/2081121<P><SPAN>When Business Asks for a Bicycle, Don't Build a Spaceship</SPAN><BR /><BR /><SPAN>I have developed a comprehensive playbook demonstrating how modern SAP tools and AI can deliver solutions in DAYS instead of MONTHS.</SPAN><BR /><BR /><SPAN>The shocking math:</SPAN><BR /><SPAN>- Traditional approach: 6 months, $650K in delayed value</SPAN><BR /><SPAN>- SAP tools + AI: 1 week, $25K in delayed value</SPAN><BR /><BR /><SPAN>This isn't just theory—it's a practical guide that covers:</SPAN><BR /><SPAN>- CDS Views for data modeling</SPAN><BR /><SPAN>- CAP for service generation</SPAN><BR /><SPAN>- Fiori Elements for instant UIs</SPAN><BR /><SPAN>- Integration Suite for connectivity</SPAN><BR /><SPAN>- AI to accelerate everything</SPAN></P><P><A title="SAPBTP+CAP+FIORI+AI" href="https://www.linkedin.com/posts/rajesh-putumbaka-456267101_sap-btp-ai-development-playbook-ugcPost-7431029390173696001-y7Yn?utm_source=share&utm_medium=member_desktop&rcm=ACoAABnYP8IBvlY4GDRmR8utVFLHXZ61gUvSa-0" target="_self" rel="nofollow noopener noreferrer">https://www.linkedin.com/posts/rajesh-putumbaka-456267101_sap-btp-ai-development-playbook-ugcPost-7431029390173696001-y7Yn?utm_source=share&utm_medium=member_desktop&rcm=ACoAABnYP8IBvlY4GDRmR8utVFLHXZ61gUvSa-0</A> <BR /><SPAN>Download the full playbook (PDF attached) and share your thoughts: Have you encountered the "perfect is the enemy of good" trap in your SAP projects?</SPAN><BR /><A class="" href="https://www.linkedin.com/search/results/all/?keywords=%23sap&origin=HASH_TAG_FROM_FEED" target="_blank" rel="noopener nofollow noreferrer"><SPAN class=""><STRONG>#SAP</STRONG></SPAN></A> <A class="" href="https://www.linkedin.com/search/results/all/?keywords=%23digitaltransformation&origin=HASH_TAG_FROM_FEED" target="_blank" rel="noopener nofollow noreferrer"><SPAN class=""><STRONG>#DigitalTransformation</STRONG></SPAN></A> <A class="" href="https://www.linkedin.com/search/results/all/?keywords=%23ai&origin=HASH_TAG_FROM_FEED" target="_blank" rel="noopener nofollow noreferrer"><SPAN class=""><STRONG>#AI</STRONG></SPAN></A> <A class="" href="https://www.linkedin.com/search/results/all/?keywords=%23sapcommunity&origin=HASH_TAG_FROM_FEED" target="_blank" rel="noopener nofollow noreferrer"><SPAN class=""><STRONG>#SAPCommunity</STRONG></SPAN></A></P>2026-02-21T19:02:14.003000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/sap-build-work-zone-tile-opens-content-federation-but-app-fails-with-ip/ba-p/14339460SAP Build Work Zone: Tile Opens(content federation) but App Fails with ‘IP Address Cannot Be Found2026-03-02T10:49:06.511000+01:00OmPrakashJhahttps://community.sap.com/t5/user/viewprofilepage/user-id/5102<DIV><P>In my SAP Build Work Zone (Standard Edition) environment, I faced an issue where a <STRONG>dynamic tile loaded successfully through content federation</STRONG>, but clicking the tile caused the application to fail with a browser error:</P><BLOCKQUOTE><P><STRONG>ERR_NAME_NOT_RESOLVED – The IP address of the server could not be found</STRONG></P></BLOCKQUOTE><P>The failing URL always contained a <STRONG>very long auto‑generated hostname.</STRONG></P><P> </P><DIV>Interestingly, the dynamic tile itself worked correctly (e.g., OData count displayed), but navigating to the corresponding SAP Fiori app consistently failed. This clearly indicated that the issue was not with backend connectivity or destinations, but with the <STRONG>content runtime URL</STRONG> generated by Work Zone.</DIV><DIV> </DIV><DIV>Please refer the screenshots.</DIV></DIV>2026-03-02T10:49:06.511000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/saml-based-single-sign-on-setup-with-sap-identity-authentication-service/ba-p/14339865SAML Based Single Sign-On Setup with SAP Identity Authentication Service2026-03-02T22:06:37.306000+01:00Rittikahttps://community.sap.com/t5/user/viewprofilepage/user-id/123061<P><STRONG>Introduction</STRONG></P><P><STRONG>About SAP Datasphere</STRONG></P><P>SAP Datasphere is SAP’s unified data service for integrating, modeling and governing data across hybrid and cloud environments. As part of SAP’s Business Technology Platform (BTP), it supports enterprise-scale analytics, governance and collaboration.</P><P> </P><P><STRONG>Need for SSO</STRONG></P><P>Traditional password-based authentication poses risks such as credential sprawl and inconsistent access control. Implementing SSO in Datasphere enhances:</P><UL><LI> <STRONG>Security</STRONG>: Centralized identity and access management.</LI><LI> <STRONG>User Experience</STRONG>: Seamless access without repetitive logins.</LI><LI> <STRONG>Compliance</STRONG>: Alignment with enterprise security and governance standards.</LI><LI> <STRONG>Efficiency</STRONG>: Reduced administrative overhead for user provisioning and password resets.</LI></UL><P> </P><P><STRONG>Architecture Overview</STRONG></P><P>SSO in SAP Datasphere is typically implemented using <STRONG>SAML 2.0</STRONG> <STRONG>(Security Assertion Markup Language)</STRONG> through <STRONG>SAP Cloud Identity Services – Identity Authentication (IAS).</STRONG></P><P><STRONG>Components Involved</STRONG></P><UL><LI><STRONG>SAP Datasphere Tenant: </STRONG>The target system for SSO-enabled access.</LI><LI><STRONG>SAP Cloud Identity Services: Identity Authentication (IAS)</STRONG>: Acts as the trusted authentication broker.</LI><LI><STRONG>Corporate Identity Provider (IdP)</STRONG>: Provides user authentication.</LI><LI><STRONG>SAP BTP Subaccount</STRONG>: Links Datasphere to IAS through service bindings.</LI></UL><P> </P><P><STRONG>Authentication Flow</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Authentication Flow.png" style="width: 549px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/378735i9D5EEE98A15DAABA/image-dimensions/549x579?v=v2" width="549" height="579" role="button" title="Authentication Flow.png" alt="Authentication Flow.png" /></span></P><P> </P><P><STRONG>Prerequisites</STRONG></P><P>Before enabling SSO, ensure the following prerequisites are met:</P><OL><LI><STRONG>SAP Datasphere Tenant</STRONG> - Provisioned and accessible via SAP BTP</LI><LI><STRONG>SAP Cloud Identity Services (IAS)</STRONG> - Tenant available and linked to BTP subaccount</LI><LI><STRONG>Corporate Identity Provider</STRONG> - Configured to support SAML 2.0</LI><LI><STRONG>Admin Access</STRONG> - Administrator roles in Datasphere, IAS and IdP</LI><LI><STRONG>Email Domain</STRONG> - Verified in IAS for trusted domain mapping</LI></OL><P>You must have the system owner role for your SAP Datasphere tenant to perform this configuration.</P><P> </P><P><STRONG>Configuration Steps</STRONG></P><P><STRONG>Step 1: Access IAS Tenant</STRONG></P><UL><LI>Log in to your <STRONG>SAP Cloud Identity Services – Identity Authentication</STRONG> admin console.</LI><LI>Under <EM>Applications & Resources → Applications</EM>, create a new application named “SAP Datasphere Test”.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rittika_1-1772483535030.png" style="width: 908px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/378720iDB7C07F0DB5D4C21/image-dimensions/908x363?v=v2" width="908" height="363" role="button" title="Rittika_1-1772483535030.png" alt="Rittika_1-1772483535030.png" /></span></P><P><STRONG>Step 2: Download Metadata</STRONG></P><UL><LI>Login to Datasphere tenant: <EM>System -> Administration -> Security</EM></LI><LI>Authentication Method: <EM>SAML Single Sign On (SSO)</EM></LI><LI>SAML Single Sign On (SSO) Configuration: <EM>Step1 - Download Service Provider Metadata</EM></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rittika_2-1772483552815.png" style="width: 914px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/378721i8905C0B29E6BAC61/image-dimensions/914x305?v=v2" width="914" height="305" role="button" title="Rittika_2-1772483552815.png" alt="Rittika_2-1772483552815.png" /></span></P><P><STRONG>Step 3: Configure SAML Settings in IAS</STRONG></P><UL><LI><STRONG>SAML 2.0 Configuration: </STRONG>Define from Metadata -> Upload the metadata downloaded from Datasphere tenant</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rittika_3-1772483569881.png" style="width: 917px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/378722i03605701EE013357/image-dimensions/917x392?v=v2" width="917" height="392" role="button" title="Rittika_3-1772483569881.png" alt="Rittika_3-1772483569881.png" /></span></P><UL><LI><STRONG>Subject Name Identifier</STRONG></LI></UL><P>Source - <EM>Identity Directory</EM> and Value - <EM>Email</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rittika_4-1772483581385.png" style="width: 920px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/378723iA25D48A76C09A4E6/image-dimensions/920x369?v=v2" width="920" height="369" role="button" title="Rittika_4-1772483581385.png" alt="Rittika_4-1772483581385.png" /></span></P><UL><LI><STRONG>Attributes:</STRONG></LI></UL><P>Maintain below values in Self-defined attributes.</P><P>For SAML attributes to be recognized it is also important that the “Groups” attribute contains the value of “sac”.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rittika_5-1772483592651.png" style="width: 920px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/378724i35355514833548E9/image-dimensions/920x511?v=v2" width="920" height="511" role="button" title="Rittika_5-1772483592651.png" alt="Rittika_5-1772483592651.png" /></span></P><UL><LI><STRONG>Conditional Authentication</STRONG></LI></UL><P>Select “Default Identity Provider” - > <EM>Your IDP</EM></P><P>“Check” the checkbox – <EM>Allow users stored in Identity Authentication service to login</EM>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rittika_6-1772483607241.png" style="width: 921px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/378725iC97B4FF224880387/image-dimensions/921x427?v=v2" width="921" height="427" role="button" title="Rittika_6-1772483607241.png" alt="Rittika_6-1772483607241.png" /></span></P><UL><LI>Download Metadata file from SAML 2.0 Configuration:</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rittika_7-1772483618191.png" style="width: 922px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/378726i0CFCA6A928BA1F67/image-dimensions/922x333?v=v2" width="922" height="333" role="button" title="Rittika_7-1772483618191.png" alt="Rittika_7-1772483618191.png" /></span></P><P><STRONG>Step 4: Configure Trust in Datasphere</STRONG></P><OL><LI>In SAP Datasphere → <EM>System → Administration → Security Settings → Identity Provider Configuration</EM>.</LI><LI><EM>Upload Identity Provider Metadata -> Upload</EM>.</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rittika_8-1772483629207.png" style="width: 922px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/378727i63B9B0159630287F/image-dimensions/922x312?v=v2" width="922" height="312" role="button" title="Rittika_8-1772483629207.png" alt="Rittika_8-1772483629207.png" /></span></P><P><EM> 3. Choose a user Attribute to map to your identity provider -> Email</EM>. It should map to User ID, Email or a custom attribute. The attribute will be used to map users from your existing SAML user list to SAP Datasphere. The selected user attribute must match the NameID (Subject Name Identifier) used in your custom SAML assertion.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rittika_9-1772483642666.png" style="width: 921px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/378728i211E43BE2741563D/image-dimensions/921x427?v=v2" width="921" height="427" role="button" title="Rittika_9-1772483642666.png" alt="Rittika_9-1772483642666.png" /></span></P><P>4. <EM>Confirm that the mapping is working -> Verify Account</EM></P><P>Copy the URL and open it in a private/incognito browser window to avoid reusing an existing session and ensure you are prompted for a fresh login.</P><P>Upon successful verification, the Login Credential field will be highlighted with a green border. After confirming this, select “Convert” to complete the SAML SSO configuration.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Image9.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/378733iC5537D62A18A0201/image-size/large?v=v2&px=999" role="button" title="Image9.png" alt="Image9.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Image10.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/378732i7254436AAA94B767/image-size/large?v=v2&px=999" role="button" title="Image10.png" alt="Image10.png" /></span></P><P> </P><P><STRONG>Step 5: Test Authentication</STRONG></P><OL><LI>Access SAP Datasphere via SSO-enabled URL.</LI><LI>Verify that users are redirected to IAS and authenticated by the corporate IdP. </LI><LI>Ensure user attributes and roles are correctly mapped in Datasphere.</LI></OL><P><STRONG>Best Practices</STRONG></P><UL><LI>Use <STRONG>HTTPS</STRONG> for all communications between systems.</LI><LI>Enable <STRONG>Multi-Factor Authentication (MFA)</STRONG> at the corporate IdP level.</LI><LI>Periodically <STRONG>rotate SAML certificates</STRONG>. </LI><LI>Maintain <STRONG>audit logs</STRONG> in IAS for compliance.</LI></UL><P><STRONG>Conclusion</STRONG></P><P>Enabling SSO in SAP Datasphere strengthens enterprise security while enhancing usability and operational efficiency. Centralizing authentication through IAS and your corporate identity provider reduces the risk of credential misuse, simplifies onboarding, and improves user productivity. As organizations continue to adopt cloud and hybrid data platforms, a well-governed identity strategy becomes essential. This SSO implementation helps establish that foundation and supports future growth and integration initiatives.</P><P><STRONG>SAP Sources</STRONG>: <A href="https://help.sap.com/docs/SAP_DATASPHERE/9f804b8efa8043539289f42f372c4862/9b26536159354aea9024a99cbbe60b4e.html?locale=en-US" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/SAP_DATASPHERE/9f804b8efa8043539289f42f372c4862/9b26536159354aea9024a99cbbe60b4e.html?locale=en-US</A></P><P><A href="https://help.sap.com/docs/SUPPORT_CONTENT/datasphere/4477056515.html?locale=en-US" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/SUPPORT_CONTENT/datasphere/4477056515.html?locale=en-US</A></P><P> </P>2026-03-02T22:06:37.306000+01:00https://community.sap.com/t5/crm-and-cx-blog-posts-by-sap/securing-your-sap-sales-amp-service-cloud-v2-esm-extensions-with/ba-p/14344239Securing Your SAP Sales & Service Cloud V2+ESM Extensions with Application Vulnerability Report-Must2026-03-08T11:23:27.165000+01:00Yoganandahttps://community.sap.com/t5/user/viewprofilepage/user-id/75<P>As organizations extend<SPAN> </SPAN><STRONG>SAP Sales & Service Cloud V2 + ESM</STRONG><SPAN> </SPAN>with custom solutions built on<SPAN> </SPAN><STRONG>SAP BTP (Business Technology Platform)</STRONG>, security becomes paramount. Whether you’re developing<SPAN> </SPAN><STRONG>CAP-based services</STRONG>,<SPAN> </SPAN><STRONG>prehooks/posthooks</STRONG>,<SPAN> </SPAN><STRONG>custom APIs</STRONG>,<SPAN> </SPAN><STRONG>Autoflow automations</STRONG>, or<SPAN> </SPAN><STRONG>mashup services</STRONG><SPAN> </SPAN>using JavaScript, Python, or Java—every extension must undergo rigorous security validation before reaching production environment (Extensions).</P><P><EM>This blog explores how the </EM><STRONG>Application Vulnerability Report (AVR) </STRONG><EM>for CloudFoundry applications ensures your SAP Sales & Service Cloud V2 + ESM extensions are production-ready and free from critical security vulnerabilities.</EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2026-03-08_11-16-13.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/381187i615B63D092F03979/image-size/large?v=v2&px=999" role="button" title="2026-03-08_11-16-13.png" alt="2026-03-08_11-16-13.png" /></span></P><H2 id="toc-hId-1791428872"><FONT color="#008000"><FONT color="#000000">What is</FONT> <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-application-vulnerability-report-for-cloudfoundry-applications/ba-p/14281684" target="_self">Application Vulnerability Report (AVR)</A>?</FONT></H2><P>The<SPAN> </SPAN><STRONG>AVR</STRONG><SPAN> </SPAN>is SAP’s built-in <FONT color="#800080"><STRONG>security scanning tool for CloudFoundry applications deployed on BTP.</STRONG></FONT> It automatically analyzes your applications for:</P><UL><LI><STRONG>Known CVEs</STRONG><SPAN> </SPAN>(Common Vulnerabilities and Exposures) in dependencies</LI><LI><STRONG>Outdated libraries</STRONG><SPAN> </SPAN>with security patches available</LI><LI><STRONG>Configuration weaknesses</STRONG><SPAN> </SPAN>in application libraries</LI><LI><STRONG><STRONG>Zero-Day</STRONG> Vulnerabilities</STRONG></LI><LI><STRONG>Container image vulnerabilities</STRONG><SPAN> </SPAN>(for Docker-based deployments)</LI></UL><H3 id="toc-hId-1723998086">Key Features:</H3><UL><LI><STRONG>Automated scanning</STRONG><SPAN> </SPAN>upon deployment on weekly scan</LI><LI><STRONG>Detailed findings</STRONG><SPAN> </SPAN>with severity ratings (Critical, High, Medium, Low)</LI><LI><STRONG>Remediation guidance</STRONG><SPAN> </SPAN>with version upgrade recommendations</LI><LI><STRONG>Compliance alignment</STRONG><SPAN> </SPAN>with industry security standards</LI></UL><P><STRONG><FONT color="#000080">Reference</FONT>:</STRONG><SPAN> </SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-application-vulnerability-report-for-cloudfoundry-applications/ba-p/14281684" target="_blank">Introducing Application Vulnerability Report for CloudFoundry Applications</A></P><H2 id="toc-hId-1398401862"><FONT color="#993300">Why Security Scanning Matters for SAP Sales & Service Cloud V2 + ESM Side by Side Extensions</FONT></H2><DIV><TABLE border="1" width="100%"><TBODY><TR><TD width="100%">This checklist is mandatory<SPAN>—without any compromise—to ensure that <FONT color="#008000"><STRONG>no security vulnerabilities exist </STRONG></FONT>in your extensions before they are deployed to the Production environment.</SPAN></TD></TR></TBODY></TABLE></DIV><P><STRONG>SAP Sales & Service Cloud V2 +ESM</STRONG> serves as the backbone for customer-facing operations. </P><DIV>Any extensions developed on BTP—whether for <STRONG>data enrichment, workflow automation, or third‑party integrations</STRONG>—introduce potential attack vectors if not properly secured.<BR /><BR />Additionally, many side‑by‑side extensions that are developed by your developers, who may not always account for all required security controls to ensure the application or APIs are tightly governed. In some cases, extensions may also have been built using <FONT color="#3366FF">AI-assisted development</FONT>, which can inadvertently introduce vulnerabilities in libraries or application logic, including risks such as <FONT color="#FF0000"><STRONG>XSS, CSRF, SSRF,</STRONG></FONT> <FONT color="#FF0000"><STRONG>RCE</STRONG></FONT> and others.</DIV><H3 id="toc-hId-1330971076">Common Extension Scenarios Requiring AVR:</H3><UL><LI><STRONG>CAP (Cloud Application Programming Model) Services</STRONG>: Custom business logic exposing OData/REST APIs</LI><LI><STRONG>Extensibility = External Hook (Prehooks & Posthooks</STRONG>) : Event-driven extensions modifying standard processes</LI><LI><STRONG>Custom Microservices</STRONG>: Standalone services for specialized business functions</LI><LI><STRONG>Autoflow Integrations</STRONG>: Low-code automations connecting external systems</LI><LI><STRONG>Mashup Services</STRONG>: Composite applications combining multiple data sources</LI></UL><P><FONT color="#FF0000"><STRONG>The Risk</STRONG>:</FONT> Vulnerabilities in dependencies, libraries outdated, insecure coding practices, or misconfigurations can expose sensitive customer data or disrupt critical business processes.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="jpeg (1)1764659722.png" style="width: 666px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/381189iD678095376B85108/image-size/large?v=v2&px=999" role="button" title="jpeg (1)1764659722.png" alt="jpeg (1)1764659722.png" /></span></P><H2 id="toc-hId-1005374852"><FONT color="#FF00FF">Conclusion</FONT></H2><P>The<SPAN> </SPAN><FONT color="#008000"><STRONG>Application Vulnerability Report</STRONG><SPAN> </SPAN></FONT>is non-negotiable for securing SAP Sales & Service Cloud V2 + ESM extensions. By integrating AVR into your development lifecycle, you:</P><UL><LI><STRONG>Protect customer data</STRONG><SPAN> </SPAN>from exploits</LI><LI><STRONG>Maintain compliance</STRONG><SPAN> </SPAN>with security standards</LI><LI><STRONG>Ensuring No security vulnerabilities violated</STRONG> in your extensions designed for SAP Sales & Service Cloud V2 + ESM </LI><LI><STRONG>Build trust</STRONG><SPAN> </SPAN>with stakeholders through proactive risk management</LI></UL><H3 id="toc-hId-937944066"><FONT color="#993300"><STRONG>Call to Action for Developers and BTP Admins (Managing your BTP Landscape)</STRONG>:</FONT></H3><H3 id="toc-hId-741430561">Before you move to production deployment, <FONT color="#0000FF">run AVR and clear all findings.</FONT><BR />Your security depends on it.<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2026-03-08_11-12-06 (1).gif" style="width: 849px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/381190i1A95B9D61B0A98F1/image-dimensions/849x977?v=v2" width="849" height="977" role="button" title="2026-03-08_11-12-06 (1).gif" alt="2026-03-08_11-12-06 (1).gif" /></span></H3>2026-03-08T11:23:27.165000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-audit-log-access-just-got-easier-here-s-what-s-new/ba-p/14345563SAP BTP Audit Log Access Just Got Easier - Here’s What’s New2026-03-10T11:39:09.623000+01:00Anisa2https://community.sap.com/t5/user/viewprofilepage/user-id/2003264<P>Hello SAP Community,</P><P><span class="lia-unicode-emoji" title=":rocket:">🚀</span>We’re excited to announce that the <STRONG>new Audit Log Viewer</STRONG> is officially live!</P><P>This release brings a faster, clearer, and more intuitive way to explore audit activity. Whether you’re tracking changes, investigating issues, or simply keeping an eye on system activity, the new viewer is designed to help you find what you need quickly and confidently.</P><P><STRONG><span class="lia-unicode-emoji" title=":direct_hit:">🎯</span>Key Changes </STRONG></P><P><STRONG>1. No More Subaccount-Level Subscription</STRONG></P><P>You no longer need to create a separate Audit Log Viewer subscription for each subaccount. The viewer is now automatically available in every subaccount, with entitlement and subscription setup handled behind the scenes.</P><P><STRONG>2. Global Account Viewer Now Included</STRONG></P><P>Previously, there was no Audit Log Viewer for Global Accounts. With this update, a viewer is now available directly in the BTP cockpit, without creating a dedicated instance. Just open the cockpit and access it from the Global Account level.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Audit Log Viewer Functionality.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/381783iFEC27921481FAE45/image-size/large?v=v2&px=999" role="button" title="Audit Log Viewer Functionality.jpg" alt="Audit Log Viewer Functionality.jpg" /></span></P><P>The new changes can be referred from the link : <A href="https://help.sap.com/whats-new/cf0cb2cb149647329b5d02aa96303f56?lastSent=2026-02-16&Component=SAP+Audit+Log&Valid_as_Of=2026-02-01:2026-02-28" target="_blank" rel="noopener noreferrer">What's new for SAP Business Technology Platform</A> </P><P>These changes simplify operations, reduce configuration work, and make audit visibility consistent across your entire BTP landscape.</P><P> </P>2026-03-10T11:39:09.623000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/sap-build-work-zone-tile-opens-content-federation-but-app-is-opening-blank/ba-p/14345820SAP Build Work Zone: Tile Opens(content federation) but App is opening blank in Mobile2026-03-10T18:08:27.193000+01:00OmPrakashJhahttps://community.sap.com/t5/user/viewprofilepage/user-id/5102<DIV><DIV><P>I am currently integrating a custom role and tile from an on‑premise S/4HANA system into <STRONG>SAP Build Work Zone</STRONG> using the <STRONG>CDM-based content federation (Exposure Version 2)</STRONG>.</P><P>Everything works fine in Build Work Zone in the browser.<BR />However, when I scan the QR code in <STRONG>SAP Start</STRONG> mobile app, the tile appears correctly — but <STRONG>after tapping the tile, the app opens a blank white screen</STRONG>.</P></DIV></DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="OmPrakashJha_0-1773162425420.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/381899i2881A55C46B2BF51/image-size/medium?v=v2&px=400" role="button" title="OmPrakashJha_0-1773162425420.png" alt="OmPrakashJha_0-1773162425420.png" /></span></P><P> </P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="OmPrakashJha_1-1773162452287.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/381900iDC8B4A8E0DA0C723/image-size/medium?v=v2&px=400" role="button" title="OmPrakashJha_1-1773162452287.png" alt="OmPrakashJha_1-1773162452287.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="OmPrakashJha_2-1773162476249.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/381901iCCC75183EC148120/image-size/medium?v=v2&px=400" role="button" title="OmPrakashJha_2-1773162476249.png" alt="OmPrakashJha_2-1773162476249.png" /></span></P><DIV>Has anyone experienced this issue where a tile loads correctly in Build Work Zone, but <STRONG>shows a blank screen when launched from SAP Start</STRONG>?</DIV>2026-03-10T18:08:27.193000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/old-tile-still-appearing-in-sap-build-work-zone-after-complete-re-exposure/ba-p/14345826Old Tile Still Appearing in SAP Build Work Zone After Complete Re‑Exposure from S/4HANA2026-03-10T18:21:19.051000+01:00OmPrakashJhahttps://community.sap.com/t5/user/viewprofilepage/user-id/5102<DIV><P>Hello Experts,</P><P>I am facing an issue with federated content from an on‑premise S/4HANA system to <STRONG>SAP Build Work Zone (Standard Edition)</STRONG>.<BR />Our authorization team has <STRONG>removed the old tile</STRONG> and assigned a <STRONG>new tile</STRONG> to the correct <STRONG>custom role, custom catalog, and custom group</STRONG> in S/4HANA.</P><P>To ensure a clean setup, I deleted the previous exposure configuration and re‑created the full setup from scratch in:</P><UL><LI><CODE>/UI2/CDM3_EXP_SCOPE</CODE> (content exposure)</LI><LI>SAP BTP → Build Work Zone → Content Provider → Synchronize Content</LI></UL><P>Despite repeating the full process multiple times, <STRONG>the old tile continues to appear in Build Work Zone</STRONG> instead of the new one.<BR />The authorization consultant has verified both the new role and the tile assignments several times on the S/4HANA side, and everything looks correct there — but <STRONG>Build Work Zone keeps federating only the old tile</STRONG>.</P><H3 id="toc-hId-1920547114">Has anyone experienced something similar?</H3><P>I am trying to understand:</P><UL><LI>Why outdated tile information is still being federated</LI><LI>Whether additional cleanup is required on the CDM or content provider side</LI><LI>If there are any cache layers (S/4HANA, BTP, or Build Work Zone) that must be explicitly cleared</LI><LI>Whether Exposure Version 2 requires specific steps to refresh or replace previously published app IDs</LI></UL><P>Any advice, known issues, or guidance on how to force Build Work Zone to pick up the updated tile would be greatly appreciated.</P><P>Thank you!</P></DIV>2026-03-10T18:21:19.051000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/build-btp-cap-app-with-fiori-integration-part-2-implementing-end-to-end-app/ba-p/14369248Build BTP CAP App with Fiori Integration – Part 2: Implementing End to End App2026-04-09T10:05:19.668000+02:00SuryaRameshhttps://community.sap.com/t5/user/viewprofilepage/user-id/2066090<P><STRONG>A quick Recall -</STRONG> So far we have completed the Pre-Requisites and set up the BTP Environment for creating/Deploying CAP Application. BTP Trail Account has been created and within Trail sub-account necessary cloud related roles have been assigned. Post that SAP HANA Cloud instance has been created and BAS Set up has been done. </P><P>PART 1 Link - <A href="https://community.sap.com/t5/technology-blog-posts-by-members/building-a-cap-app-with-fiori-integration-part-1-environment-amp-hana-cloud/ba-p/14367752" target="_blank">Building a CAP App with Fiori Integration – Part 1: Environment & HANA Cloud Setup</A> </P><P>As a part of second episode in this CAP Application blog series, we are about to develop an end to end CAP Application with layers of validation of security in a detailed way. This blog helps beginner to build end to end CAP Application.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Flowchart giving overview for complete Process" style="width: 615px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394975i29745BCA6E347BCA/image-dimensions/615x374?v=v2" width="615" height="374" role="button" title="Untitled Diagram.drawio (1).png" alt="Flowchart giving overview for complete Process" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Flowchart giving overview for complete Process</span></span></P><P>Ever struggled to deploy a CAP app with HANA + XSUAA + App router?.</P><P>I did. After multiple failures, here is a complete working guide <span class="lia-unicode-emoji" title=":backhand_index_pointing_down:">👇</span></P><P><STRONG>BACKEND BUILD :</STRONG></P><P>1. Navigate to BAS->Dev Space and Create new project from Template.</P><P><STRONG>After creating CAP Project Run these Below terminal Commands which has unique operation.</STRONG></P><P>a. This below terminal command to be added which will <SPAN>prepare the CAP project for a real-world cloud environment i.e. SAP BTP. <STRONG>add hana</STRONG> will switch database from SQLITE to HANA Cloud & <STRONG>add xsuaa</STRONG> will enable authorization for the project. Also When we ran the command cds add xsuaa --for production then CAP automatically generates the security folder <STRONG>xs-security.json.</STRONG></SPAN></P><pre class="lia-code-sample language-bash"><code>cds add hana,xsuaa --for production</code></pre><P>b. Below terminal command will add blueprint for deployment.</P><pre class="lia-code-sample language-bash"><code>cds add mta</code></pre><P>c. Below terminal command will install libraries.</P><pre class="lia-code-sample language-bash"><code>npm install</code></pre><P>2. Select CAP Project Option and name the project and select options as below. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img1.png" style="width: 619px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395054i00E3D3335B1C2DA3/image-dimensions/619x260?v=v2" width="619" height="260" role="button" title="CAP Part2_img1.png" alt="CAP Part2_img1.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img2.png" style="width: 606px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395055i6229D457CCEC1DA3/image-dimensions/606x390?v=v2" width="606" height="390" role="button" title="CAP Part2_img2.png" alt="CAP Part2_img2.png" /></span></P><P>3. Click on Finish after selecting all the options.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img3.png" style="width: 603px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395056i296FCBF32198A255/image-dimensions/603x406?v=v2" width="603" height="406" role="button" title="CAP Part2_img3.png" alt="CAP Part2_img3.png" /></span></P><P>4. Once Project is created it will be available in the Workspace.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img4.png" style="width: 337px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395062i57B24532ED4A8507/image-dimensions/337x412?v=v2" width="337" height="412" role="button" title="CAP Part2_img4.png" alt="CAP Part2_img4.png" /></span></P><P>5. We can view the path of the project created using below Terminal command. ( <STRONG>Note : </STRONG>Use <STRONG>Ctrl + ~</STRONG> to open terminal ).</P><pre class="lia-code-sample language-bash"><code>user: CRUDApp $ pwd</code></pre><P>Once this Terminal command is entered the response will come as <STRONG>/home/user/projects/CRUDApp. </STRONG></P><P>6. Now the Project is created. The Aim is to create service instance in Cloud Foundry space <STRONG>dev </STRONG>which I shown in <STRONG><A href="https://community.sap.com/t5/technology-blog-posts-by-members/building-a-cap-app-with-fiori-integration-part-1-environment-amp-hana-cloud/ba-p/14367752" target="_blank">PART 1</A> </STRONG> and through the service instance the linkage to HANA Cloud central DB Instance will be triggered with runtime HDI Container created. Through this HDI Container the Deployment data will be mapped to runtime DB. </P><P>Before getting into next point. Let me give a quick overview on different folder paths/ files in CAP Project that has been created. ( Refer to the workspace image from Point 4. )</P><P>a) <STRONG>db/</STRONG> - This is <STRONG>database schema </STRONG>where we will create CDS Entities/tables and it's relationships. It’s is the source of data structure.</P><P>b) <STRONG>app/</STRONG> - In this folder the front end Fiori Generator App will be mapped which has further navigations to Controllers and views. From here only we will write front end logic.</P><P>c) <STRONG>srv/</STRONG> - This is service folder where <STRONG>api services</STRONG> will be created from backend and if required custom logic can be enabled using node js in js file. </P><P>d) <STRONG>.vscode</STRONG> - <SPAN>This is a hidden folder containing configurations specific to </SPAN><STRONG>Visual Studio Code </STRONG>or BAS<SPAN>. It stores things like your launch configuration and recommended extensions for the project.</SPAN></P><P>e) <STRONG>mta.yaml</STRONG> -<SPAN> Multi-Target Application file is the provides <STRONG>instruction to cloud</STRONG></SPAN><SPAN>. It tells SAP BTP how to package and deploy your app, which database to create, which security services to bind, and how much memory to use.</SPAN></P><P>f)<STRONG> package.json</STRONG> - This is the Project Meta data which holds <STRONG>libraries to run project. </STRONG></P><P>Now let's continue with further steps from Backend.</P><P>7. Create a file <STRONG>schema.cds </STRONG>as below to <STRONG>/db </STRONG>folder and create Entity bookshop. This Entity is designed to store Book details. The same will be created as table in SAP HANA Cloud.</P><pre class="lia-code-sample language-abap"><code>namespace my.bookshop;
entity Books {
key ID : Integer;
title : String;
stock : Integer;
author : String;
}</code></pre><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img5.png" style="width: 348px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395125iCF0B544B6286CFB1/image-dimensions/348x188?v=v2" width="348" height="188" role="button" title="CAP Part2_img5.png" alt="CAP Part2_img5.png" /></span></P><P>8. Create a file <STRONG>schema.cds </STRONG>as below to <STRONG>/srv </STRONG>folder. In this Service folder we are adding annotation <STRONG>@requires: 'Admin'</STRONG> which indicates Role required for Authorization.</P><pre class="lia-code-sample language-abap"><code>using { my.bookshop as my } from '../db/schema';
service CatalogService {
@requires: 'Admin' // XSUAA Role Required
entity Books as projection on my.Books;
}</code></pre><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img6.png" style="width: 311px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395165iDEE4A9D4ACF73953/image-dimensions/311x434?v=v2" width="311" height="434" role="button" title="CAP Part2_img6.png" alt="CAP Part2_img6.png" /></span></P><P><STRONG>FRONT END BUILD:</STRONG></P><P>1. Click Ctrl + Shift + P and select Open Fiori App Generator as shown below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img11.png" style="width: 584px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395188i61EEA414AFBEB3F4/image-dimensions/584x219?v=v2" width="584" height="219" role="button" title="CAP Part2_img11.png" alt="CAP Part2_img11.png" /></span></P><P>2. Since this is a basic app and henceforth Select <STRONG>List Report Template</STRONG> as below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img12.png" style="width: 462px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395192i09AA94CA979F9DF4/image-dimensions/462x304?v=v2" width="462" height="304" role="button" title="CAP Part2_img12.png" alt="CAP Part2_img12.png" /></span></P><P>3. Now select Data source as <STRONG>Local CAP Project </STRONG>and select CAP Project and OData service. After this select on<STRONG> Next</STRONG> button. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img13.png" style="width: 453px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395193i31D9EA7BDD46D718/image-dimensions/453x370?v=v2" width="453" height="370" role="button" title="CAP Part2_img13.png" alt="CAP Part2_img13.png" /></span></P><P>4. Give Name to App and Module.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img14.png" style="width: 427px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395196i32AE2E1D11E017A8/image-dimensions/427x343?v=v2" width="427" height="343" role="button" title="CAP Part2_img14.png" alt="CAP Part2_img14.png" /></span></P><P>5. Then <STRONG>Deployment configuration </STRONG>should be auto-picked as cloud foundry and If required fill Destination. For this app Im not creating Destination and henceforth selection the option as<STRONG> None.</STRONG> After this select Finish option which will create Fiori App in Project Folder. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img15.png" style="width: 385px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395197iE9668120201220E8/image-dimensions/385x405?v=v2" width="385" height="405" role="button" title="CAP Part2_img15.png" alt="CAP Part2_img15.png" /></span></P><P> </P><P><STRONG>VALIDATION :</STRONG></P><P>1. Create a file <STRONG>cat-service.js</STRONG><STRONG> </STRONG>as below to <STRONG>/srv </STRONG>folder. </P><pre class="lia-code-sample language-javascript"><code>const cds = require('@sap/cds')
module.exports = cds.service.impl(async function() {
const { Books } = this.entities;
// Logic: Validation BEFORE creating a record
this.before('CREATE', 'Books', req => {
const { title } = req.data;
if (!title || title.length < 3) {
// This is like an 'E' message in ABAP
req.error(400, 'Title is too short! Minimum 3 characters required.');
}
})
})</code></pre><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img7.png" style="width: 416px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395168i17C6780FFCD1A41F/image-dimensions/416x402?v=v2" width="416" height="402" role="button" title="CAP Part2_img7.png" alt="CAP Part2_img7.png" /></span></P><P>2. As per above logic, we are adding some validation before SAVE using Node JS Function. As per this validation if Title length is less than 3 then error will be thrown. Similarly we can use other functions as well to perform business operation which triggers during save, After save etc. </P><P><STRONG>SECURITY:</STRONG></P><P>1. When the Environment was set up in <STRONG>BACKEND BUILD->1.a), </STRONG>we ran the command <STRONG>cds add xsuaa --for production </STRONG>which in turn created the folder <STRONG>xs-security.json. </STRONG></P><P>2. Now the aim is to deploy the app to production and create HTML5 App in BTP. So here we are adding a security layer which tells only Authorized user can access the data. While defining the service in <STRONG>BACKEND BUILD->8. </STRONG>where <STRONG>Admin</STRONG> role is annotated to <STRONG>books</STRONG> entity. </P><P>3. Lets create Approuter now and configure JSON to add necessary roles. </P><P>4. There are two options for adding Approuters.</P><P>a. Right click on <STRONG>mta.yaml </STRONG>file and select <STRONG>Create </STRONG><STRONG><SPAN>MTA Module From Template </SPAN></STRONG><SPAN>and then select <STRONG>Managed Approuter. </STRONG></SPAN></P><P><STRONG><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img8.png" style="width: 342px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395179i9C9DD6A360B12134/image-dimensions/342x365?v=v2" width="342" height="365" role="button" title="CAP Part2_img8.png" alt="CAP Part2_img8.png" /></span></SPAN></STRONG></P><P><STRONG><SPAN>b.</SPAN></STRONG> If Managed Approuter option is not showing, then below terminal command is a reliable 'Reset' button. It cleans up the MTA configuration and sets up a standalone router that works independently of external BTP subscriptions. </P><pre class="lia-code-sample language-bash"><code>cds add approuter</code></pre><P>5. Currently Im going with 4.b) with manual terminal command for adding Approuter. Once that is done then approuter will be added as below in <STRONG>app/ </STRONG>folder. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img10.png" style="width: 320px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395187i4544B6FB50CE602F/image-dimensions/320x287?v=v2" width="320" height="287" role="button" title="CAP Part2_img10.png" alt="CAP Part2_img10.png" /></span></P><P>6. Add below JSON to folder <STRONG>xs-security.json</STRONG> in project which will define the role which is binded in <STRONG>service</STRONG> and <STRONG>yaml</STRONG>. </P><pre class="lia-code-sample language-json"><code>{
"xsappname": "my-bookshop",
"scopes": [
{
"name": "$XSAPPNAME.Admin",
"description": "Admin"
}
],
"role-templates": [
{
"name": "AdminRole",
"scope-references": [ "$XSAPPNAME.Admin" ]
}
],
"attributes": [],
"authorities-inheritance": false
}</code></pre><P><STRONG>DEPLOYMENT:</STRONG></P><P>1. So till now we have built this CAP Application in<SPAN> "Vertical Stack" (Database → Logic → Security → Routing → UI).</SPAN></P><P>2. Now before final deployment lets test the things done till now is correct. Use below terminal command. If everything is fine then<SPAN class=""> You see your database schema, custom logic, approuter config, and Fiori manifest listed.</SPAN></P><DIV class=""> </DIV><pre class="lia-code-sample language-bash"><code>ls -R | grep -E "schema.cds|cat-service.js|xs-app.json|manifest.json"</code></pre><P>3. Now compile all the files to check if any error occurs. Use below terminal commands.</P><pre class="lia-code-sample language-bash"><code>cds compile db/
cds compile srv/
cds compile srv/ --to xsuaa</code></pre><P> Note: All these commands should not throw error to proceed with next steps.</P><P>4. After Sanity checks, run below command to login to terminal. <STRONG>Note: </STRONG>It will ask for Api Endpoint for first time during login. It can be found from BTP Cockpit -> Overview -> Cloud Foundry Environment -> API End Point.</P><pre class="lia-code-sample language-bash"><code>cf login</code></pre><P>5. Now run Deployment command in terminal. This is done to test the app locally. Once testing is completed the app needs to be deployed to Production.</P><pre class="lia-code-sample language-bash"><code>cds deploy --to hana --profile hybrid</code></pre><P>6. If cds deploy is not working properly then define step by step process of creating service instance, HDI Containers etc. through terminal commands below. Note: cds deploy will create everything by default so dont use these in combination. use these terminal commands <STRONG>only if cds deploy is not working. </STRONG></P><pre class="lia-code-sample language-bash"><code>cf create-service hana hdi-shared my-cap-app
cds bind --to my-cap-app
cds env get requires.db --profile hybrid
cds deploy --to hana --profile hybrid</code></pre><P>7. Run below commands to deploy the app to production. </P><P> </P><pre class="lia-code-sample language-abap"><code>mbt build</code></pre><P> </P><P>8. <SPAN>When finished, a new folder named <STRONG>mta_archives/</STRONG></SPAN><SPAN> will appear as below containing Project file. </SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img24.png" style="width: 255px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395224i5F82399B1F44D6C6/image-dimensions/255x297?v=v2" width="255" height="297" role="button" title="CAP Part2_img24.png" alt="CAP Part2_img24.png" /></span></SPAN></P><P><SPAN>9. Now do a login again with below command. Give appropriate API Key and user details.</SPAN></P><pre class="lia-code-sample language-bash"><code>cf login</code></pre><P><SPAN>10. Run below command to <STRONG>Complete final HTML5 App deployment. </STRONG></SPAN></P><pre class="lia-code-sample language-bash"><code>cf deploy mta_archives/CRUDApp_1.0.0.mtar</code></pre><P><STRONG>Note</STRONG>: Sometimes Deployment will fail. <SPAN>To avoid these common pitfalls, </SPAN><STRONG>"Only include essential resources (HANA, XSUAA, Destination, and HTML5) in your<SPAN> </SPAN><CODE>mta.yaml</CODE><SPAN> </SPAN>and ensure your<SPAN> </SPAN><CODE>xsappname</CODE><SPAN> </SPAN>in<SPAN> </SPAN><CODE>xs-security.json</CODE><SPAN> </SPAN>is consistent throughout the project to prevent service plan unavailability and identity mismatch errors on Trial accounts." </STRONG>If something fails, make these changes and delete the service and redeploy. After redeployment dont forgot to add role collections again to make sure Approuters will not cause auth errors. </P><P><STRONG>TESTING</STRONG></P><P>1. Run below Terminal command to test the app locally.</P><pre class="lia-code-sample language-abap"><code>cds watch --profile hybrid</code></pre><P> 2. After this the app will open in next screen to test it from web level. Note: Make sure your HANA DB Instance is running in HANA Cloud Central which will create entry in DB Level. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img16.png" style="width: 557px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395203i298B8BEFB7DE51AA/image-dimensions/557x228?v=v2" width="557" height="228" role="button" title="CAP Part2_img16.png" alt="CAP Part2_img16.png" /></span></P><P>3. Now while testing this app we can see the user login screen which will ask for mail and password for login. This is happening due to XSUAA and Approuter. While trying to make entry to the app it will show error <STRONG>forbidden </STRONG>as below. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img17.png" style="width: 504px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395204i638E84AE38C7AF68/image-dimensions/504x230?v=v2" width="504" height="230" role="button" title="CAP Part2_img17.png" alt="CAP Part2_img17.png" /></span></P><P>4. Now run this command below to create service Instance first. Even after cds deploy this is required because cds deploy only talks to the Database (HANA). It does not talk to the Security Service (XSUAA). In SAP BTP, the database (CRUDApp-db) and the security (XSUAA) are two completely separate buildings. This terminal logic is required to enable link. </P><pre class="lia-code-sample language-bash"><code>cf create-service xsuaa application CRUDApp-auth -c xs-security.json</code></pre><P> 5. Post this navigate to <STRONG>BTP Cockpit -> SubAccount -> Security -> Role Collections </STRONG>and click on <STRONG>Create </STRONG>Button as below. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img18.png" style="width: 536px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395205i4EE2BA9A2A973F06/image-dimensions/536x279?v=v2" width="536" height="279" role="button" title="CAP Part2_img18.png" alt="CAP Part2_img18.png" /></span></P><P>6. Create Role collection <STRONG>Bookshop_Admin_Group </STRONG>with its Description as below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img19.png" style="width: 552px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395206i955B3A6F307FB712/image-dimensions/552x216?v=v2" width="552" height="216" role="button" title="CAP Part2_img19.png" alt="CAP Part2_img19.png" /></span></P><P>7. Now Navigate to the Role collection <STRONG>Bookshop_Admin_Group </STRONG>and click on Edit. Open value help of Role and select the App name from <STRONG>Application Identifier </STRONG>dropdown. After selecting Role Admin which enables Authorization, click save. Follow below images sequentially. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img20.png" style="width: 556px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395219iC0048E562FA6F219/image-dimensions/556x183?v=v2" width="556" height="183" role="button" title="CAP Part2_img20.png" alt="CAP Part2_img20.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img21.png" style="width: 566px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395220i3EC4506F7B97D04C/image-dimensions/566x241?v=v2" width="566" height="241" role="button" title="CAP Part2_img21.png" alt="CAP Part2_img21.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img22.png" style="width: 554px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395221i39B220AB640360F1/image-dimensions/554x240?v=v2" width="554" height="240" role="button" title="CAP Part2_img22.png" alt="CAP Part2_img22.png" /></span></P><P>8. After saving, the role will be available in Role collection as below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP Part2_img23.png" style="width: 618px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395222i8B98AA7D8F87E44F/image-dimensions/618x170?v=v2" width="618" height="170" role="button" title="CAP Part2_img23.png" alt="CAP Part2_img23.png" /></span></P><P>9. Now refresh the app and try running, It will work !. Note: Sometimes Auth error will still occur if you test locally. In that case assign your URL to user <STRONG>Alice</STRONG> or deploy and test the app. </P><P>10. Also once deployed to HTML5 Apps or Dev space, the app can be directly tested from there as well. </P><P><STRONG>FINAL APP EXECUTION<span class="lia-unicode-emoji" title=":fire:">🔥</span>:</STRONG></P><P>1. Now, lets open the app as below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP-01-EXE.png" style="width: 811px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395317iFFBA4BF36E7DE08D/image-dimensions/811x138?v=v2" width="811" height="138" role="button" title="CAP-01-EXE.png" alt="CAP-01-EXE.png" /></span></P><P>2. Lets create some incorrect entries as below. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP-06-EXE.png" style="width: 788px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395326iA8CA3F8B887F69B1/image-dimensions/788x109?v=v2" width="788" height="109" role="button" title="CAP-06-EXE.png" alt="CAP-06-EXE.png" /></span></P><P>3. Validation Error occurs as per Node js logic for incorrect inputs. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP-05-EXE.png" style="width: 601px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395328iE12F7C8BB2A732FC/image-dimensions/601x302?v=v2" width="601" height="302" role="button" title="CAP-05-EXE.png" alt="CAP-05-EXE.png" /></span></P><P>4. While creating valid records, Data gets created as below without any auth error/Forbidden as the custom role collection created and mapped to Admin Role. <STRONG>Note: </STRONG>Unique UUID will be generated for each record as per CAP Entity definition made. The UUID can be viewed in Cloud DB.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP-07-EXE.png" style="width: 696px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395332i2F6CE96231751F53/image-dimensions/696x172?v=v2" width="696" height="172" role="button" title="CAP-07-EXE.png" alt="CAP-07-EXE.png" /></span></P><P>5. Now navigate to SAP HANA Cloud and click on ... dots. select option "<STRONG>OPEN IN SAP HANA Database Explorer".</STRONG></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP-02-EXE.png" style="width: 678px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395319iC64DFC8C4059D7AD/image-dimensions/678x344?v=v2" width="678" height="344" role="button" title="CAP-02-EXE.png" alt="CAP-02-EXE.png" /></span></STRONG></P><P>4. Once SAP HANA Database Explorer opens then login to cloud foundry Environment from there.</P><P>5. Now select the "+" icon and select HDI Containers options and then select app container specific to app name.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP-03-EXE.png" style="width: 747px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395338i7D6BF0F6A07C6BDA/image-dimensions/747x220?v=v2" width="747" height="220" role="button" title="CAP-03-EXE.png" alt="CAP-03-EXE.png" /></span></P><P>7. From <STRONG>CRUDAPP-db</STRONG> HDI Container, Navigate to <STRONG>Tables</STRONG> and select <STRONG>open data</STRONG>.</P><P>8. The Data created from Fiori App is available in Cloud Table as below along with UUID auto-generated.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP-04-EXE.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395342i80ACAD6BA808949C/image-size/large?v=v2&px=999" role="button" title="CAP-04-EXE.png" alt="CAP-04-EXE.png" /></span></P><P><STRONG>CONCLUSION:</STRONG></P><P>Hence the overall flow looks as below.</P><P>Fiori UI<BR />↓<BR />App router<BR />↓<BR />CAP Service<BR />↓<BR />HANA DB (HDI Container)</P><P>With this blog series we learned how to set up environment, enable cloud instance, create end to end CAP Full stack application which has capability to communicate with SAP HANA Cloud instance and create entries over there, enable App routers to CAP App and Enable validation while creating entries. </P><P>I hope this blog will be helpful for enthusiasts who are learning CAP !. In future I will create add-on series with steps to deploy this app to SAP Build work zone. </P>2026-04-09T10:05:19.668000+02:00