We've been using Appgate SDP for a few months now, mostly for standard VPN replacement, but I was really excited to try out their just-in-time (JIT) access features. Our server admin team needed a way to get temporary, elevated access to production systems without standing privileges sitting around.
I wanted to see if the API-first approach lived up to the hype for automating this. The goal was: a team member requests access via our internal portal, which triggers an Appgate policy for a specific 4-hour window, and then we get a webhook confirmation back.
Here's a snippet of the core POST request to the Appgate API to create a temporary entitlement. We used the `entitlements` endpoint:
```json
{
"name": "JIT-ServerAdmin-Prod",
"actions": ["ssh", "rdp"],
"condition": "'${user:groups}' contains 'server_admins'",
"timeout": "240 minutes",
"disabled": false
}
```
The tricky part was the webhook reliability for logging and alerting. I set up a listener on Make to catch the `EntitlementUsed` event. Had to be careful with:
* The SSL verification (their cert chain needed an intermediate)
* Rate limiting on our side to handle potential burst logs
* Parsing the JSON payload to extract the exact user and target host
So far, it's been solid! The policy engine is flexible. Curious if anyone else has tackled JIT with their APIs or integrated it into something like Zapier? I'm thinking of building a connector template.
What pitfalls did you hit with conditional access or session timeouts?
Webhooks or bust.
Interesting, but I'm stuck on the four-hour window you mentioned. That's a massive, standing privilege for an entire shift, just served via API. The point of JIT is supposed to be scoped to the *task*, not the *shift*. If someone needs eight hours to patch a server, something's wrong, and if they only need twenty minutes, you've handed them four hours of unnecessary risk.
Your webhook challenges are telling, by the way. If the logging integration is that fiddly with cert chains and rate limiting, how do you know you're actually capturing every access event? A missed event isn't just a log gap, it's a policy audit failure. I'd be looking at that listener's error queue more than its success logs.
Trust but verify.
You're not wrong about the four hour window. We landed on it because our legacy change management system only approves requests in half-day blocks. So the JIT access just mirrors a bad process, which defeats the purpose.
But on your second point about the webhooks, that's exactly why we pay for a separate logging agent that pulls from the appliance directly, on a schedule. The webhooks are for real-time alerts, but the agent is the source of truth for the audit. If they don't match, we've got a bigger problem.
trust but verify
Makes sense about the separate logging agent. I'm curious, when you pull logs on a schedule, how do you handle the delay? If a policy is revoked early, does the agent still get that event before the next sync, or do you rely on the real-time webhook to flag a mismatch immediately?
PipelinePadawan
That timeout field is a perfect example of cargo-culting manual process into "automation." You've just automated a bad manual approval. The real power of the API is you could have your internal portal dynamically calculate the timeout based on the ticket's estimated effort, or better yet, tie the revocation to the end of the actual SSH session itself.
Also, if your condition is just checking a static group membership, you're still dealing with standing privilege. It's just the privilege to *request* the JIT access. The JIT part becomes a minor inconvenience. The real risk is still the group membership, which presumably never expires.
I'd scrap the fixed timeout entirely. Make the request include a task ID, and have a cleanup lambda that runs every 15 minutes to kill entitlements where the associated ticket is marked resolved. That's actual just-in-time. What you've built is just-in-case, delivered via API.
keep it simple
Totally agree on the cleanup lambda. We actually implemented something similar after a renewal. The key was making our internal ticket system the source of truth, not our directory group. That static group check is the real standing privilege, like you said.
One caveat: the lambda approach needs a rock-solid idempotency check. Ours fires every 10 minutes but we had duplicate revocation calls at first. A small DynamoDB lock table fixed it.
Scrapping the fixed timeout cut our average entitlement window from 3.5 hours to about 47 minutes. The vendor wasn't thrilled we used their API to reduce our potential upsell, but our CISO loved the audit report 😅
That's a solid start, and using Make for the webhook listener is clever. We tried a similar integration, but the real headache for us wasn't the SSL so much as the payload variance between events. The "EntitlementUsed" payload was straightforward, but we also needed to catch "EntitlementRevoked" events for a complete audit trail, and its structure was slightly different. It caused our initial parser to choke.
I'd recommend adding a quick test for each event type your listener might receive, even if you think you're only subscribing to one. The API's consistency isn't always perfect. Good luck with the rollout
That's a solid use case for the API. The condition field is where a lot of teams trip up, though. Using `'${user:groups}' contains 'server_admins'` for JIT is still a standing check - the standing privilege is simply the permanent membership in that directory group. You've automated the ticket, but the real policy gate is static.
For a tighter setup, you could modify the condition to also validate a temporary attribute. Some teams set a short-lived custom attribute in their directory during the approval workflow, then check for that in the condition alongside the group. It means the user needs both the group *and* the current, temporary flag, which gets cleared when the task is done. It adds one more API call but closes that standing privilege loophole.
api first
Oh, that's a really good point about the group membership still being a standing privilege. I hadn't thought of it that way. The temporary attribute idea sounds smart, but doesn't that just shift the problem to managing that attribute's lifecycle? How do you make sure it's always cleared? That seems like a new thing to monitor.
Your webhook reliability concerns are common. That SSL chain issue is often down to the appliance's built-in cert, which many teams replace with a properly chained one from their internal CA before going live.
On the payload parsing, you've hit on the key operational hurdle. If you're only listening for `EntitlementUsed`, you're missing the full audit lifecycle. You need to also capture `EntitlementRevoked` and `EntitlementCreated` to track the entire window. The schema can differ slightly, so your parser needs to handle a union of event types, not just one.
For rate limiting, a simple token bucket on your listener side is fine, but consider if the SDP itself can be configured to batch or queue events, which is often more reliable than throttling on the receiver.
BenchMark
Exactly - automating the existing approval window just reinforces the inefficiency. Your four hour block is a common legacy trap. We've seen teams move to more granular entitlements by using the API to integrate directly with their change ticket system, pulling the planned maintenance window from the ticket itself as the timeout parameter. That way the JIT access is genuinely scoped to the task duration, not an arbitrary half-day block.
On the logging agent, that dual-source approach is smart for integrity checking. How do you handle drift between the agent's pull schedule and a real-time revocation? Is there a reconciliation process that triggers on a mismatch, or is it purely an alert for manual investigation?
Support is a product, not a department.
Glad you're digging into the API! That JSON snippet is a great starting point, and webhooks are the right move for audit trails. Just a heads-up on the `condition` field: using that static group check means your JIT access is still gated by a permanent standing privilege. A few replies down touched on this.
For the webhook parsing, definitely test for all event types, not just `EntitlementUsed`. The `EntitlementRevoked` payload schema can differ, and missing those events leaves a hole in your audit timeline. Ask me how I know 😅
Also, a fixed 4-hour `timeout` is safe, but if your goal is real just-in-time, consider pulling the duration from your ticketing system's planned maintenance window. It's a few more API calls but shrinks the exposure window dramatically.
cost first, then scale