5.1 KiB
5.1 KiB
Security Guidelines - API Documentation
🔒 Keamanan API Documentation
Current Implementation
Saat ini API documentation (Swagger UI) di /docs PUBLIC - bisa diakses tanpa authentication.
⚠️ Security Considerations
Risiko jika docs public:
- Information Disclosure: Endpoint structure terlihat semua orang
- Attack Surface: Attacker tahu semua endpoint yang ada
- API Key Exposure: Jika ada contoh API key di docs (jangan!)
- Business Logic: Flow bisnis bisa terlihat
Tapi juga ada benefit:
- Developer Experience: Developer mudah test API
- Onboarding: New developer cepat paham
- Integration: Partner bisa lihat spec dengan mudah
🛡️ Opsi Security untuk Docs
Opsi 1: Public (Current - Recommended untuk Internal API)
Cocok untuk:
- Internal API (tidak public internet)
- API dengan authentication kuat (JWT + Role)
- Development/Staging environment
Kelebihan:
- Mudah digunakan
- Developer friendly
- Tidak perlu setup tambahan
Kekurangan:
- Endpoint structure terlihat
- Perlu pastikan tidak ada sensitive info di docs
Opsi 2: JWT Protected (Recommended untuk Production)
Protect /docs dengan JWT middleware.
Implementasi:
Update public/index.php:
use App\Middleware\JwtMiddleware;
// ...
// Docs route - dengan JWT protection
$jwtMiddleware = new JwtMiddleware();
$app->get('/docs', function ($request, $response) {
// ... existing code ...
})->add($jwtMiddleware);
$app->get('/docs/openapi.json', function ($request, $response) {
// ... existing code ...
})->add($jwtMiddleware);
Cocok untuk:
- Production API yang sensitive
- Public API dengan authentication
- API yang perlu kontrol akses
Opsi 3: IP Whitelist (Paling Ketat)
Hanya allow IP tertentu yang bisa akses docs.
Implementasi:
Buat middleware src/Middleware/IpWhitelistMiddleware.php:
<?php
declare(strict_types=1);
namespace App\Middleware;
use App\Config\AppConfig;
use App\Support\ResponseHelper;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Slim\Psr7\Factory\ResponseFactory;
class IpWhitelistMiddleware implements MiddlewareInterface
{
private array $allowedIps;
public function __construct(array $allowedIps)
{
$this->allowedIps = $allowedIps;
}
public function process(
ServerRequestInterface $request,
RequestHandlerInterface $handler
): ResponseInterface {
$serverParams = $request->getServerParams();
$clientIp = $serverParams['REMOTE_ADDR'] ?? '0.0.0.0';
// Check X-Forwarded-For (behind proxy)
if (isset($serverParams['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $serverParams['HTTP_X_FORWARDED_FOR']);
$clientIp = trim($ips[0]);
}
if (!in_array($clientIp, $this->allowedIps, true)) {
$responseFactory = new ResponseFactory();
$response = $responseFactory->createResponse();
return ResponseHelper::json(
$response,
['error' => 'forbidden', 'message' => 'Access denied'],
403
);
}
return $handler->handle($request);
}
}
Gunakan di public/index.php:
use App\Middleware\IpWhitelistMiddleware;
use App\Config\AppConfig;
// Get allowed IPs from ENV
$allowedIps = explode(',', AppConfig::get('DOCS_ALLOWED_IPS', ''));
$ipWhitelist = new IpWhitelistMiddleware($allowedIps);
$app->get('/docs', function ($request, $response) {
// ... existing code ...
})->add($ipWhitelist);
Cocok untuk:
- Very sensitive API
- Internal company network only
- High security requirement
Opsi 4: Basic Auth (Simple)
Protect dengan HTTP Basic Authentication.
Implementasi:
Buat middleware atau gunakan nginx basic auth:
location /docs {
auth_basic "API Documentation";
auth_basic_user_file /path/to/.htpasswd;
# ... rest of config
}
📋 Recommendations
Untuk API Internal (Current Setup)
Status: ✅ AMAN jika:
- API hanya diakses dari internal network
- Semua endpoint sudah protected dengan JWT/API Key
- Tidak ada sensitive data di OpenAPI spec
- Server tidak exposed ke public internet
Action:
- Pastikan tidak ada contoh API key/password di docs
- Review OpenAPI spec sebelum deploy
- Monitor access logs
Untuk Public API
Status: ⚠️ PERLU PROTECTION jika:
- API exposed ke public internet
- Ada sensitive business logic
- Compliance requirement (GDPR, dll)
Action:
- Implement JWT protection untuk
/docs - Atau IP whitelist untuk internal team
- Review dan sanitize OpenAPI spec
🔐 Best Practices
- Jangan hardcode credentials di OpenAPI spec
- Gunakan environment variables untuk examples
- Review secara berkala endpoint yang di-expose
- Monitor access logs untuk
/docs - Update docs jika ada perubahan security
🚨 Jika Perlu Protect Docs Sekarang
Saya bisa implement JWT protection untuk /docs dengan cepat. Tinggal kasih tahu mau pakai opsi mana!