# Try it on the demo stack

Run Straza with midPoint, Keycloak, AI agents and MCP servers on one machine, and see what the seeded stack does.

- Who: You, as alice, the admin of the stack
- Where: A terminal and a browser, on the machine that runs Docker or through SSH tunnels to it
- Profile: Enterprise

In short: A Docker Compose project runs strazad with midPoint as the IGA, Keycloak for sign-in, AI agents and MCP servers. You sign in as alice, watch Straza allow, deny and hold commands from the agent sam, and approve the held deploy. Then you disable sam in midPoint and Straza stops it.


ThedemostackisaDockerComposeprojectthatrunsstrazadontheenterpriseprofiletogetherwiththesystemsanenterpriseconnectstoit.midPointisthe[IGA](https://docs.straza.ai/evaluate/identity-and-your-iga/index.md).ItcreatesthepeopleandAI[agents](https://docs.straza.ai/concepts/identities/index.md),sendsthemtoStrazaoverSCIM,andcreatesaKeycloakaccountforeachperson.Keycloakistheidentityproviderthatsignspeoplein.TheagentsamwascreatedinmidPointandrunsinitsowncontainer.Youbringthestackupandsigninasalice.Thenyourunthreeofsam'scommands:a[policy](https://docs.straza.ai/concepts/policy-model/index.md)allows`ls`,denies`rm-rf`,andholdsadeployuntilalice[approves](https://docs.straza.ai/concepts/approvals-model/index.md)it.Last,youdisablesaminmidPointandseeStrazarefuseitsnextcommand.Diagram:Whatrunsonthedemostackandwhattheseedersetsup.Eachlinkedpartopensitspage.Thedemostack.Inthebrowseryouopenthelandingpage,theconsole,thephoneapprover,Keycloak,midPoint,Kibanaandthechatface.midPoint,theIGA,sendspeople,agentsandrolestostrazadoverSCIM,readsStraza'susers,serversandrolesbackbylivesync,andmakesKeycloakaccountsforpeople,andKeycloaksignsthemin.TheagentssamandjoeeachrunbesideaStrazaservicethatholdstheagent'skeyandchecksinwithstrazad,andjoe'sMCPcallsgothroughthegatewayinstrazad,whichaddseachserver'scredential.strazadkeepsitsconfigurationandrecordsinPostgres,usesNATSasitseventbroker,andpostseveryeventtoElasticsearch,whichKibanasearches.Theseedercreatesalice,joeandsaminmidPoint,therolesdeveloper,operatorandsec-approvers,andthepolicysetagent-guardrails.##Beforeyoustart{.nostep}-DockerEnginewiththecomposeplugin,onamachinewith8GBofmemoryandfourprocessors,thesizethispagewaswalkedon.[Requirementsandsizing](https://docs.straza.ai/reference/requirements-and-sizing/index.md)coversarealdeployment.-AcloneoftheStrazarepository,and`curl`.-OnDockerDesktop,hostnetworkingturnedon,inversion4.34orlater,becausesam'scontainerusesit.-FortheCLIsteps,`strazactl`onyourPATH,as[Putthebinariesonyourpath](https://docs.straza.ai/guides/operate/install/index.md#put-the-binaries-on-your-path)shows.>Actnow:Runitonanetworkyoutrust>>EverylogininthestackispublicanditservesplainHTTP.Thelauncheralsoopensitsportsoneveryinterfaceofthemachine.Runitonlyonanetworkyoutrust,orinthehardenedshapethat[Demostackdefaultsandthehardenedshape](https://docs.straza.ai/guides/operate/demo-stack-defaults/index.md)describes.##BringthestackupFromtherepositoryroot,startthestackandfollowtheseeder,theone-shotjobthatfinishesthesetup.Terminal,ontheDockerhost:```shdeploy/compose/eval-stack/up.shdockercompose-pstraza-evallogs-feval-seed````up.sh`,or`up.ps1`onWindows,startsthebasecomposefilealone.Italsohandsstrazadyourmachine'saddress,soaphoneyoupairlatercanreachtheapprover.AfirstbootbuildstheStrazaimagesandpullsthethird-partyones,soittakeslongerthanlaterboots.Itstimewasnotmeasuredforthispage.Youshouldsee:Nearitsendtheseederprints`EVALSTACKREADY`,thentheaddressestoopen.Recordedoutput:Theendoftheseeder'slogonthewalkedstack,trimmedtothelinesaboutsamandtheaddresses:```text[seed]sam-sre-agentisinStraza(SCIM)✔[seed]sam-sre-agenthasnoKeycloakaccount✔(thehumangateontheaccesspackagesholds,soagentsridethekeylane)[seed]aliceisinStrazawithstraza-adminassignedbymidPoint✔(origin:theidentitymanager)[seed]sam-sre-agentholdsoperator,assignedbymidPoint✔(theoperatorrole)[seed]============================================================[seed]EVALSTACKREADY-theagentworkforcewasborninmidPointand[seed]provisionedintoStraza(SCIM),zeromanualsteps:joe(supervised[seed]Javadeveloperagent,theharnessidentityandchatface,withan[seed]explicitKeycloaklogin)holdsthedeveloperroleandsam(autonomous[seed]SREagent,keylaneonly)theoperatorrole.Botharesponsoredby[seed]alice:Strazasendstheirgatedcallstoherphone.[seed]Landingpage:http://localhost:8400<-starthere[seed]Console:http://localhost:8420/console/(alice/alice)[seed]midPoint:http://localhost:8087/midpoint(administrator/$MP_ADMIN_PASSWORD)[seed]Kill-switchdemo:disablesam-sre-agentinmidPoint->authANDaccessdie.```##SigninasaliceThelandingpageat`http://localhost:8400`liststhestack'saccountsandaddresses,withwalkthroughs.Opentheconsoleat`http://localhost:8420/console/`andpress**Signin**.Keycloakopensinthesametab.Signinas`alice`withthepassword`alice`,andKeycloaksendsthetabback.aliceisanadminbecausemidPointassignedhertheadminrole,andsheisthe[sponsor](https://docs.straza.ai/concepts/identities/index.md)ofsam,thepersonwhoanswersforit.Youshouldsee:Theconsoleopenson**Overview**,andthefootofthemenureads`enterprise`and`strazadv1.0.0-1695-gdec5ce12`,thebuildyoustarted.WiththeCLI:`strazactl`hasnosign-inofitsown.ItrunsonanadminAPItokenthatalicemintsintheconsole.Clickpathintheconsole:"Settings"›"APItokens"›"NewAPItoken"Nameit`alice-terminal`,pick`expiresin30days`andthejob**Fullroot**,andpress**Minttoken**.Copythetoken,becausethesheetshowsitonce.Pasteitatthe`read`linebelowandpressEnter,whichkeepsitoffthescreenandoutoftheshellhistory.Terminal,administration:```shexportSTRAZA_SERVER=http://localhost:8420read-rsSTRAZA_API_TOKEN&&exportSTRAZA_API_TOKENcurl-s"$STRAZA_SERVER/version"``````text{"version":"v1.0.0-1695-gdec5ce12","commit":"dec5ce12","go":"go1.26.10","os":"linux","arch":"amd64","profile":"enterprise","runtimes":["remote"],"approver":{"public_url":"https://127.0.0.1:8443","tls_spki_pin":"sha256/u9od/8QtLsBKV5mBRNSqLA2xMXq4YwaA16Sqzt5Zv2A=","cert_not_after":"2029-01-16T14:04:07Z","auto_minted":true,"cert_file":"/var/lib/straza/approver-tls/cert.pem"}}````version`namesthebuildyoustartedand`profile`is`enterprise`.Whoeverholdsthetokenactsasanadminuntilitexpires,sokeepitinthisterminalandneverwhereanagentruns.##Watchsam'scommandssamrunsinthecontainer`straza-sam`,andaStrazaserviceinthecontainerbesideitholdssam'skey.`strazaexec`asksStrazaaboutonecommandbeforeitrunsit.Ontheenterpriseprofileacommandisdenieduntilapolicyallowsit.Theseededpolicy`agent-guardrails`allowssam'sshell,deniesdestructivecommands,andturnsadeployintoaticketthatapersonapproves.Terminal,ontheDockerhost:```shdockerexecstraza-samstrazaexec--lsdockerexecstraza-samstrazaexec--rm-rfbuild/dockerexecstraza-samstrazaexec--./deployprod```Youshouldsee:`ls`runsandprints`deploy`.`rm-rf`isrefusedwith`Straza:destructivecommanddeniedbytheagentguardrails`.Thedeployisrefusedwith`Straza:approvalticket…ispending`andtheplacesapersondecides.Recordedoutput:```textdeployStraza:destructivecommanddeniedbytheagentguardrailsStraza:approvalticket01a19df2-a1b3-7bcf-9326-5aaae4171f10ispending.Apersondecideswithin24hours,ontheself-servicepage(http://localhost:8420/self-service/),theconsole,oranenrolledphone.Waitforthedecisionwiththestraza__approval_awaittool(ref01a19df2-a1b3-7bcf-9326-5aaae4171f10),orretrythisexactcallafterapproval;itfailsifdeniedorexpired.````strazaexec`decidesthecommanditisgivenandnottheprocessesthatcommandstarts.Anagent'scallstoMCPserversgothroughthegatewayinstead,whichisasecurityboundary.[Thesecuritymodel](https://docs.straza.ai/evaluate/security-model/index.md)explainswhateachpathenforces.##ApprovethedeployasaliceTheticketgoestosam'ssponsoraliceandtoeveryholderoftheapproverrole`sec-approvers`,andthefirstanswercounts.Intheconsole:Clickpathintheconsole:"Approvals"›"Requests"›"Approve"›"Approverequest"Therowreads`./deployprod`for`sam-sre-agent`,decidedby`aliceorsec-approvers`,withabout24hoursleft.Thedialogsaysthenextsuchcallbysamwithinthegrantwindowrunsonce.Youshouldsee:`Approved../deployprodmayrunoncewithinthegrantwindowforsam-sre-agent.`WiththeCLI:`strazactlapprovalslist`showsthewaitingticket,but`strazactl`doesnotdecide,becauseadecisionmustnamethepersonwhomadeit.alicedecidesintheconsoleasabove,orontheself-servicepage.Nowrunthedeployagain,withinthehour.Terminal,ontheDockerhost:```shdockerexecstraza-samstrazaexec--./deployprod``````textdeploy:pretendingtoshipprod(evaldemoartifact,nothingrealhappens)```Ifthisfails:`Straza:approvalticket…ispending.`again,withanewreference:Thegrantwasalreadyused,ormorethananhourpassedsincetheapproval.Approvethenewticket,thenrunthedeployoncemore.Thegrantisusedonce,andathirdrunraisesanewticket.Eachofthesedecisions,fromthefirstdenytotheuseofthegrant,isarecordonthe[auditchain](https://docs.straza.ai/concepts/evidence/index.md).##DisablesaminmidPointmidPointownseveryidentityinthestack,soyoudisablesaminmidPoint.DisablesamovermidPoint'sRESTinterfacewiththeobjectiditsseedobjectcarries.ThemidPointadministratorpasswordisthelabdefaultthelandingpagelists.Terminal,midPointREST:```shcurl-u'administrator:StrazaEval5ecr3t!'-H'Content-Type:application/json'-XPATCH\-d'{"objectModification":{"itemDelta":[{"modificationType":"replace","path":"activation/administrativeStatus","value":"disabled"}]}}'\http://localhost:8087/midpoint/ws/rest/users/b6f9f2c8-0d5a-4e77-9a1e-9d3c0e5a1c48dockerexecstraza-samstrazaexec--ls``````textStraza:userisdisabled.ContactyouradministratorRefusingtorun.```midPointanswerswithnobodyandsendsthechangetoStrazaoverSCIM,whereStrazarevokeseverysessionsamholdsandrefusestoopenanewoneuntilmidPointenablessamagain.Sothe`ls`thatranaminuteagoisrefused.Inthewalk,StrazalistedsamasdisabledassoonasmidPointanswered,undertwosecondsaftertherequest.Diagram:WhatthedisablestartsinStraza.Youridentitymanagerdisablesapersonoranagent.Strazarevokestheirsessionsandrefusesnewcheck-ins.Connectedclientsgettherevocationasapushanddenyeverycall.Eachstepisrecorded.1.Youridentitymanagerdisablesapersonoranagent.OverSCIMthatisactivesettofalse.2.Strazarevokeseverysessionofthatidentityandrefusesitsnextcheck-ins.3.Connectedclientsgettherevocationasapushoverstrazad'sownaddressanddenyeverycallthatsessionmakes.4.Theidentityisstoppedoneverymachine.Aclientthatmissedthepushisrefusedatitsnextcheck-in.5.Eachstepleavesarecordintheauditchain.Intheconsole:On**Users**,setthe**Status**filterto`disabled`,open`sam-sre-agent`,andpress**open**after**Audittrail**.Youshouldsee:sam'srowreads`disabled`and`locked`,andthesheetsays`LockedbyStraza.deactivatedviaSCIM`.Theaudittrailholds`user.killed`withthereason`deactivatedviaSCIM`,andtherefused`login`with`userisdisabled`.WiththeCLI:Terminal,administration:```shstrazactluserslist``````tableUSERNAMESTATUSORIGINEMAILIDsam-sre-agentdisabledscimsam@agents.example.com01a1547c-3f3d-7238-b13b-b5b6090ba343```Thelistingistrimmedtosam'srow.Toputsamback,sendthesamerequestwiththevalue`enabled`,thenletsamrunacommand.Terminal,midPointREST:```shcurl-u'administrator:StrazaEval5ecr3t!'-H'Content-Type:application/json'-XPATCH\-d'{"objectModification":{"itemDelta":[{"modificationType":"replace","path":"activation/administrativeStatus","value":"enabled"}]}}'\http://localhost:8087/midpoint/ws/rest/users/b6f9f2c8-0d5a-4e77-9a1e-9d3c0e5a1c48dockerexecstraza-samstrazaexec--ls``````textdeploy```Thesessionsthedisablerevokedstayrevoked,andsam'snextcommandopensanewonewiththesamekey.WiththeCLI:Terminal,administration:```shstrazactlaudittail--typestraza.audit.identity--usersam-sre-agent--limit50``````text#33773[sam-sre-agent]{"data":{"action":"user.killed","origin":"scim","reason":"deactivatedviaSCIM","sessionsRevoked":1,"user":"01a1547c-3f3d-7238-b13b-b5b6090ba343"},"id":"34fa53d7-29ab-4d98-9ce7-a1378b8484c5","source":"strazad/0ada1a6b-898a-4ecc-ba24-2df16e573ccd","specversion":"1.0","time":"2026-11-02T20:29:05.235850987Z","type":"straza.audit.identity"}#33779[sam-sre-agent]{"data":{"action":"user.reactivated","origin":"scim","user":"01a1547c-3f3d-7238-b13b-b5b6090ba343"},"id":"cf5a4df9-f315-4aa1-8e55-bbc9953c95a2","source":"strazad/0ada1a6b-898a-4ecc-ba24-2df16e573ccd","specversion":"1.0","time":"2026-11-02T20:29:38.389515053Z","type":"straza.audit.identity"}````user.killed`countstheonesessionitrevoked,and`user.reactivated`namesthesameorigin.Whenyouaredone,findthetoken'sidwith`strazactlapi-tokenlist`andrevokeitwith`strazactlapi-tokenrevoke`andthatid.##Moreonthisstack{.nostep}Thestackissetupformorethanthiswalk.Eachitembelowrunsonitastheseederleavesit,unlesstheitemnamesanoverlayoraprofile.midPointandStrazastayinstepinbothdirections.midPointsendspeople,agents,sponsorsandrolemembershiptostrazadoverSCIM.ThreelivesynctasksinmidPointreadStraza'susers,MCPserversandrolesbackevery10seconds,afterafirstreconciliationofeach,soachangemadeinStrazashowsupinmidPoint.Whenstrazadrestarts,midPointsuspendsthosetasks,andtheystaysuspendeduntilsomeoneresumestheminmidPoint.WhattheseederconfiguresinmidPointandKeycloak:-midPointhasaresourceforStrazaontheuniversalRESTconnectorandaresourceforKeycloak.TheKeycloakresourcecreatesanaccountforeachperson.AgentsgetnoKeycloakaccount,becausetheysigninwithkeys.-Archetypesforemployees,externals,AIagentsandpersonalagentssetthetypeofeachidentityinStraza,andanagent'ssponsorreferenceinmidPointbecomesitssponsorinStraza.-AccesspackagesarebusinessrolesinmidPointthatgrantStrazaroles.aliceholdstheadminpackage,samtheoperatorpackageandjoethedeveloperpackage.ivanholdstheapproverpackage,whichgiveshimtheapproverrolesec-approvers,anddaveholdstheglobalMCPadminpackage.-ninaisanAIagentwithnoaccess.Assignitthepackage`BR:Straza-analyst-access`inmidPointtowatchanagentgainaccessthroughtheIGA.-FinanceTeamisaroleapersoncanrequestinmidPoint.Therequestgoestothemanagerofthepersonitisfor,andwithoutamanageritisrejected.janaisanewemployeewithnoroles,thepersontorequestitfor.-InStraza,thebusinessroledeveloperbundlestheapplicationrolesdemo-tools-sandbox,views-demo-tools,objects-demo-toolsandmidpoint-self-service.operatorbundlesdemo-tools-readersandmidpoint-operations,andanalystbundlesdemo-tools-readersandmidpoint-self-service.Theapprovalgatesofanapplicationrolesitinapolicysetnamedafteritwiththesuffix`-access`,suchas`midpoint-operations-access`,and`agent-guardrails`holdstherulesforlocalcommands.-TheKeycloakrealmis`straza`.midPoint'sAPItokeninStrazacarriesthesixscopesoftheIGAconnectorjob:`scim:read`,`scim:write`,`identity:read`,`apps:read`,`changes:read`and`config:read`.-objects-demoservestenrepositoriesandmarksitstoolsbyrepository,soarolecanreachsomeofthemandnottherest.[Limitaroletosomeobjects](https://docs.straza.ai/guides/serve-mcp-apps/limit-a-role-to-some-objects/index.md)setsthatup.-views-demohasatoolwithaview,whichaclientthatsupportsMCPAppscanshow.[ShowMCPAppsviews](https://docs.straza.ai/guides/serve-mcp-apps/show-views/index.md)coversit.-ThemidpointserverisanMCPserverinfrontofmidPoint.Itactsasthecallingperson,allowsreads,andholdswritesforanapproval.-postgresputsadaptive-pg-mcpinfrontoffourdemodatabasesonmidPoint'sPostgresserver.Itstartswhenthestackdirectory's`.env`sets`COMPOSE_PROFILES=pg`.-Withthesiemoverlay,strazadpostseveryauditandrevocationeventtoElasticsearch,andKibanaonport5601searchesthem.[SinksandSIEM](https://docs.straza.ai/guides/audit/sinks-and-siem/index.md)explainsthesink.-Withthedemooverlay,joeworksasClaudeCodeinthe`straza-harness`containerandbehindthechatfaceonport8477.Theoverlaybuildsfromthestraza-agents-demorepository,whichisnotpublic.-Aphonethatalicepairswiththeapproveronport8443decidesheldcallstoo,as[Approveonaphone](https://docs.straza.ai/guides/approve/phone/index.md)shows.Thelandingpagehasmorewalkthroughs.[Demostackdefaultsandthehardenedshape](https://docs.straza.ai/guides/operate/demo-stack-defaults/index.md)listseachaccount,thesettingsthatarelabshortcuts,howtoreachthestackfromanothermachineoverSSH,andhowtotearitdown.Howthispagewaswalked:Everystepafterthefirstbootranon2026-11-02againstademostackthatwasalreadyup,builtatv1.0.0-1695-gdec5ce12.Itrunsthefourcomposefilesofthehardenedshape,soitsportslistenon127.0.0.1onlyand`up.sh`didnotstartit.Theseeder'slinescomefromitslastrun.TheconsolestepsraninheadlessChromiumasalice,whosignedinthroughKeycloakeachtime.`strazactl`wasbuiltatv1.0.0-1700-g89d0cf1dandranonthetokenmintedintheconsole.Afterwardstheticketofthethirddeploywasdeniedintheconsole,andthetokenwasrevoked.Next:[Thesecuritymodel](https://docs.straza.ai/evaluate/security-model/index.md)


Walked on v1.0.0-1695-gdec5ce12 on 2026-11-02, except the first boot, which ran before this walk and was not repeated. Walked the running demo stack on Rocky Linux 10.2, x86_64, with Docker Engine 29.9.2 and the four compose files of the hardened shape, with the browser steps in headless Chromium.

