WebLogic Server 15.1.1.0.0 on Oracle Linux 9
Overview
This guide covers launching and using the WebLogic Server 15.1.1.0.0 on Oracle Linux 9 AMI from SecureAnyCloud on Amazon EC2. The AMI is one version of the SecureAnyCloud Oracle WebLogic Server listing on AWS Marketplace. You pick it as the software version when you subscribe and launch.
Oracle WebLogic Server is Oracle's Jakarta EE application server. It runs enterprise Java applications, web services and messaging workloads with clustering, JDBC connection pools, JMS and a full security realm.
Release 15.1.1.0.0 is a full Jakarta EE 9.1 platform that uses the jakarta.* namespace. Applications built for the javax.* namespace of WebLogic 14.1.x must be migrated. The release supports Java SE 17 and 21 and is administered with the WebLogic Remote Console, because the in-server Administration Console is no longer part of WebLogic Server.
What you get:
- A domain made on your instance, not on ours. The image contains the WebLogic Server installation only. On the first boot of every instance, a one-time service creates
base_domainfrom Oracle's own domain template with an administrator password generated on that instance. The domain's encryption salt (SerializedSystemIni.dat), its embedded LDAP store and its boot identity are therefore unique to your instance, and no two instances share a credential. The password never appears on a command line or in a log. It is written to/root/weblogic-credentials.txt, which only root can read. - Fail closed. WebLogic and the HTTPS front end refuse to start until first boot has finished. If first boot fails, the partial domain is removed and nothing listens.
- HTTPS from the first boot. The AdminServer listens on
127.0.0.1:7001only. nginx 1.26 serves it on port 443 with a certificate generated on your instance; port 80 redirects to HTTPS. Requests for a host name the instance does not serve get no answer, and WebLogic's internal servlets are not published. - Hardened defaults. SSH accepts keys only, with no passwords, no
rootlogin and no X11 forwarding, and root has no password at all. The domain runs in production mode with IIOP off, anonymous T3/IIOP RMI off, and WebLogic's default internal servlets (HTTP tunnelling) off. WebLogic takes the client address from the connection, never from a header a client can forge, and the/management/API is rate-limited. WebLogic and nginx are blocked from the instance metadata service, and the AMI requires IMDSv2. SELinux stays enforcing, theoracleaccount has no password, and the server runs under a locked-down systemd unit. The Derby demo database is never started. - Base media only. WebLogic Server is installed from Oracle's 15.1.1.0.0 release media (verified by checksum and by Oracle's code signature on the installer) with no PSU or other Oracle patch applied. You apply Oracle's patches with your own Oracle support (see Step 11).
- A Java runtime that dnf keeps patched. WebLogic runs on Oracle Linux's own OpenJDK 21 (the
java-21-openjdk-headlesspackage from the Oracle Linux 9 AppStream), reached through the alternatives path/usr/lib/jvm/jre-21-openjdk, so OpenJDK security updates install withdnflike any other package and need no WebLogic configuration change. No Oracle JDK is included (see Licensing). - A fully patched operating system. Oracle Linux 9 is fully patched at build time, and
dnf-automaticapplies Oracle Linux security updates (OpenJDK included) every day.
What is on the image: Oracle WebLogic Server 15.1.1.0.0 (WebLogic Server and Coherence) in /u01/app/oracle/product, Oracle Linux OpenJDK 21 (java-21-openjdk-headless, JAVA_HOME /usr/lib/jvm/jre-21-openjdk), nginx, Oracle Linux 9.8 with the Unbreakable Enterprise Kernel, cloud-init and the AWS Systems Manager agent.
- Default user:
ec2-user - Architecture: x86_64
- Recommended instance type: m5.large
Licensing
Oracle WebLogic Server is a commercial Oracle product. Using WebLogic Server requires your own Oracle WebLogic Server license that covers the instance under Oracle's cloud licensing policy. The SecureAnyCloud charge covers the hardened image, first-boot setup and support, not an Oracle license.
The Java runtime is Oracle Linux's OpenJDK 21, which is open source (GPLv2 with the Classpath Exception) and patched through dnf. The image includes no Oracle JDK. Oracle's WebLogic Server certification names Oracle JDK (17 and 21 for 15.1.1.0.0), so if your Oracle support requires it, install Oracle JDK under your own Oracle entitlement and point WebLogic at it (Step 11 shows how).
The notices are in /usr/share/doc/sac/licenses/, and the OpenJDK license is in /usr/lib/jvm/jre-21-openjdk/legal/java.base/.
Prerequisites
- An AWS account subscribed to the listing, an EC2 key pair and a VPC subnet with a route to the internet (or a private route you use for management).
- A security group with the following rules. Port 7001 is never needed in the security group.
- TCP 443 (HTTPS: WebLogic Remote Console, the REST management API and your applications) from the people and systems that use WebLogic
- TCP 80 (redirects to HTTPS) from the same people and systems
- TCP 22 (SSH) from your own networks only
Launch the instance
In the AWS Marketplace listing, choose Continue to Subscribe, then Continue to Configuration. Pick WebLogic Server 15.1.1.0.0 on Oracle Linux 9 as the software version, pick your Region, and choose Launch through EC2.
Choose m5.large (or larger for production application workloads), your key pair, and a security group as described above. The root volume holds the WebLogic installation, your domain and its logs, so give it room for your applications (for example 30 GiB). The root file system grows to fill the volume on first boot.
To launch with the AWS CLI, replace the values in angle brackets:
aws ec2 run-instances --region <region> --image-id <ami-id-from-the-listing> \
--instance-type m5.large --key-name <your-key-pair> \
--security-group-ids <your-security-group> --subnet-id <your-subnet> \
--metadata-options HttpTokens=required,HttpEndpoint=enabled \
--block-device-mappings 'DeviceName=/dev/sda1,Ebs={VolumeSize=30,VolumeType=gp3}' \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=weblogic}]'Connect to your instance
Connect over SSH as the default user for your version:
- WebLogic Server 15.1.1.0.0 on Oracle Linux 9: SSH user ec2-user
ssh -i <your-key.pem> ec2-user@<public-ip>Confirm the operating system release:
cat /etc/oracle-releaseOracle Linux Server release 9.8Check the services
On a newly launched instance, first boot creates the domain in about two minutes. The instance is still loading its disk from the AMI snapshot, which makes the first Java start slow. The AdminServer then reaches RUNNING about 17 seconds later, so WebLogic is ready about three minutes after launch. This was measured on nine fresh 2 vCPU, 8 GiB instances, which took 2 min 26 s to 3 min 43 s from boot to RUNNING.
Until then, nginx is not started and port 443 refuses connections. Check the three units:
sudo systemctl is-active weblogic-firstboot.service weblogic.service nginx.serviceactive active activeweblogic-firstboot.service reports active because it is a one-time unit that has finished. On later boots it sees its marker and does nothing.
The first boot log shows the host name the instance was configured for and how long the domain took. This example comes from a newly launched instance. On a warm disk, the domain takes about 40 seconds:
sudo cat /var/log/weblogic-firstboot.log[2026-10-20T22:55:12Z] weblogic-firstboot: configured host: ec2-35-175-233-6.compute-1.amazonaws.com [2026-10-20T22:55:12Z] weblogic-firstboot: creating base_domain (WLST offline from Oracle's wls.jar template) [2026-10-20T22:57:16Z] weblogic-firstboot: TLS certificate + nginx host for ec2-35-175-233-6.compute-1.amazonaws.com [2026-10-20T22:57:17Z] weblogic-firstboot: done in 125s; starting WebLogic and nginxIf weblogic.service shows activating, wait a few seconds and run the command again.
Get your URL and password
The values generated for this instance are in a root-only file. This command shows the file with the password hidden:
sudo sed -E 's/^(WEBLOGIC_PASSWORD=).*/\1<hidden>/' /root/weblogic-credentials.txt# Oracle WebLogic Server 15.1.1.0.0 - this instance's own credentials (generated on its first boot) # Generated: 2026-10-20T22:57:17Z WEBLOGIC_USER=weblogic WEBLOGIC_PASSWORD=<hidden> WEBLOGIC_ADMIN_URL=https://ec2-35-175-233-6.compute-1.amazonaws.com/ WEBLOGIC_REST_URL=https://ec2-35-175-233-6.compute-1.amazonaws.com/management/weblogic/latest WEBLOGIC_WELCOME_URL=https://ec2-35-175-233-6.compute-1.amazonaws.com/console/welcome/ DOMAIN_HOME=/u01/app/oracle/product/user_projects/domains/base_domain TLS_CERT_SHA256_FINGERPRINT=BC:CB:32:30:71:0E:5B:21:A7:B9:7A:7E:CF:58:E8:3D:70:3A:B6:CA:E6:AD:66:6A:98:6C:D1:D9:A4:10:82:68Print the password itself when you need it, and store it in your secret manager:
sudo sed -n 's/^WEBLOGIC_PASSWORD=//p' /root/weblogic-credentials.txtThe host name is the instance's public DNS name. When the instance has no public name, it is the instance's public or private address. To serve WebLogic on your own DNS name, see Step 9.
Open WebLogic over HTTPS
The certificate is self-signed and generated on your instance. Check the certificate, and compare its SHA-256 fingerprint with TLS_CERT_SHA256_FINGERPRINT above before you trust it in a browser or in Remote Console:
sudo openssl x509 -in /etc/nginx/ssl/weblogic.crt -noout -subject -enddate -ext subjectAltNamesubject=CN=ec2-35-175-233-6.compute-1.amazonaws.com notAfter=Jan 22 22:57:17 2029 GMT X509v3 Subject Alternative Name: DNS:ec2-35-175-233-6.compute-1.amazonaws.com, IP Address:35.175.233.6, DNS:ip-172-31-95-72.ec2.internal, IP Address:172.31.95.72, DNS:localhost, IP Address:127.0.0.1From the instance, the welcome page answers over HTTPS with that certificate, and port 80 redirects to HTTPS:
H=$(sudo cat /etc/sac/weblogic-host)
curl -s -o /dev/null -w "%{http_code}\n" --cacert <(sudo cat /etc/nginx/ssl/weblogic.crt) --resolve "$H:443:127.0.0.1" "https://$H/console/welcome/"
curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" --resolve "$H:80:127.0.0.1" "http://$H/"200 301 https://ec2-35-175-233-6.compute-1.amazonaws.com/Only root and nginx can read the certificate file, so these commands hand it to curl with sudo cat. The file is a public certificate, not a secret.
In your browser, open the WEBLOGIC_WELCOME_URL from Step 4, and accept the self-signed certificate after checking its fingerprint. WebLogic Server 15.1.1 serves this welcome page because the original Administration Console is no longer part of WebLogic Server. The page links to the WebLogic Remote Console download and mentions the Hosted WebLogic Remote Console (see Step 6).
Administer the domain with WebLogic Remote Console
Desktop Remote Console. Install WebLogic Remote Console on your workstation from the welcome page link. Add an Admin Server Connection with these values:
- URL: the
WEBLOGIC_ADMIN_URLfrom Step 4 (for examplehttps://ec2-35-175-233-6.compute-1.amazonaws.com/) - Username: weblogic
- Password: the password from Step 4
Remote Console talks to the AdminServer's REST management API over port 443. Because the certificate is self-signed, either import /etc/nginx/ssl/weblogic.crt into Remote Console's trust store, or compare the fingerprint and then tick Make Insecure Connection. Remote Console covers deployments, data sources, JMS, security realms, users and groups, and monitoring.
Hosted Remote Console in your browser (optional). WebLogic Server 15.1.1 also ships the Remote Console as a web application (wlserver/server/lib/wls-remote-console.war, Remote Console 2.4.18). You can deploy it on the AdminServer and use it from a browser at https://<your-host>/rconsole/, with no desktop install. It is not deployed in the image, so nothing extra is exposed until you choose to deploy it.
Deploy it with WLST as the oracle user. The password is handed over in a file that only oracle can read, as in Step 8, and the deployment takes about 30 seconds:
PWF=$(sudo mktemp /run/wlst-pw.XXXXXX)
sudo sed -n 's/^WEBLOGIC_PASSWORD=//p' /root/weblogic-credentials.txt | sudo tee "$PWF" >/dev/null
sudo chown oracle:oinstall "$PWF" cat > /tmp/wlst-rconsole.py <<'PY' import os f = open(os.environ['PWF']); pw = f.read().strip(); f.close() connect('weblogic', pw, 't3://127.0.0.1:7001') deploy('wls-remote-console', '/u01/app/oracle/product/wlserver/server/lib/wls-remote-console.war', targets='AdminServer', upload='false') print('Deployed: ' + str(cmo.lookupAppDeployment('wls-remote-console').getName())) disconnect() PY chmod 0644 /tmp/wlst-rconsole.py
sudo setpriv --reuid=oracle --regid=oinstall --init-groups env HOME=/home/oracle PWF="$PWF" \
/u01/app/oracle/product/oracle_common/common/bin/wlst.sh /tmp/wlst-rconsole.py 2>&1 | grep -E 'Deployment State|Deployed:'
sudo rm -f "$PWF" /tmp/wlst-rconsole.py
H=$(sudo cat /etc/sac/weblogic-host)
curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" --cacert <(sudo cat /etc/nginx/ssl/weblogic.crt) --resolve "$H:443:127.0.0.1" "https://$H/rconsole/"Deployment State : completed Deployed: wls-remote-console 302 https://ec2-35-175-233-6.compute-1.amazonaws.com/rconsole/signin/index.htmlOpen https://<your-host>/rconsole/ and sign in as weblogic with the password from Step 4.
Choose This Server under Providers, then choose a tree. Use Edit Tree to change the configuration, Monitoring Tree for runtime state, and Security Data Tree for users, groups and policies.
The red Security warnings detected banner is WebLogic's own configuration check. On this image it lists two items that follow from the design (HTTPS is terminated by nginx and the AdminServer has no SSL listener), explained in Step 12. The hosted console signs you out after 10 minutes of inactivity.
Because the hosted console is a sign-in page on port 443, keep 443 limited to your administration networks while it is deployed. Remove it when you no longer need it with WLST undeploy('wls-remote-console').
Use the REST management API
The REST management API uses the same administrator credentials. This command reads the password from the credentials file and hands it to curl in a configuration stream, so the password never appears on a command line:
H=$(sudo cat /etc/sac/weblogic-host)
PW=$(sudo sed -n 's/^WEBLOGIC_PASSWORD=//p' /root/weblogic-credentials.txt)
curl -s --cacert <(sudo cat /etc/nginx/ssl/weblogic.crt) --resolve "$H:443:127.0.0.1" -K <(printf 'user = "weblogic:%s"\n' "$PW") \
"https://$H/management/weblogic/latest/serverRuntime?links=none&fields=name,state,weblogicVersion" unset PW{ "weblogicVersion": "WebLogic Server 15.1.1.0.0 Wed Oct 01 23:34:34 GMT 2025 2196592", "state": "RUNNING", "name": "AdminServer" }The domain itself:
H=$(sudo cat /etc/sac/weblogic-host)
PW=$(sudo sed -n 's/^WEBLOGIC_PASSWORD=//p' /root/weblogic-credentials.txt)
curl -s --cacert <(sudo cat /etc/nginx/ssl/weblogic.crt) --resolve "$H:443:127.0.0.1" -K <(printf 'user = "weblogic:%s"\n' "$PW") \
"https://$H/management/weblogic/latest/domainConfig?links=none&fields=name,domainVersion,productionModeEnabled" unset PW{ "productionModeEnabled": true, "domainVersion": "15.1.1.0.0", "name": "base_domain" }You can make the same request from a browser signed in as weblogic.
A request without credentials is refused (401). The instance also carries a self-test that proves the password, the anonymous refusal and a wrong-password refusal in one run:
H=$(sudo cat /etc/sac/weblogic-host)
curl -s -o /dev/null -w "%{http_code}\n" --cacert <(sudo cat /etc/nginx/ssl/weblogic.crt) --resolve "$H:443:127.0.0.1" "https://$H/management/weblogic/latest/serverRuntime"
sudo /usr/local/sbin/weblogic-selftest401 per-instance admin password: AdminServer RUNNING over https://ec2-35-175-233-6.compute-1.amazonaws.com/ (instance certificate verified); anonymous HTTP 401; wrong password HTTP 401 WLS_ROUNDTRIP_OKState-changing REST requests also need the X-Requested-By header, which is WebLogic's own protection against cross-site requests.
Script administration with WLST
The WebLogic Scripting Tool (WLST) runs as the oracle user and connects to the AdminServer over T3 on the loopback address. This example hands the password to WLST in a file that only oracle can read, never on a command line or in an environment variable. It prints the domain and server state and then removes the file:
PWF=$(sudo mktemp /run/wlst-pw.XXXXXX)
sudo sed -n 's/^WEBLOGIC_PASSWORD=//p' /root/weblogic-credentials.txt | sudo tee "$PWF" >/dev/null
sudo chown oracle:oinstall "$PWF" cat > /tmp/wlst-check.py <<'PY' import os f = open(os.environ['PWF']); pw = f.read().strip(); f.close() connect('weblogic', pw, 't3://127.0.0.1:7001') print('Connected to domain: ' + cmo.getName()) serverRuntime() print('AdminServer state: ' + cmo.getState()) disconnect() PY chmod 0644 /tmp/wlst-check.py
sudo setpriv --reuid=oracle --regid=oinstall --init-groups env HOME=/home/oracle PWF="$PWF" \
/u01/app/oracle/product/oracle_common/common/bin/wlst.sh /tmp/wlst-check.py 2>&1 | grep -E 'Connected to domain|AdminServer state'
sudo rm -f "$PWF" /tmp/wlst-check.pyConnected to domain: base_domain AdminServer state: RUNNINGFor an interactive session, run sudo -u oracle /u01/app/oracle/product/oracle_common/common/bin/wlst.sh, then connect('weblogic', '<password>', 't3://127.0.0.1:7001'), edit(), startEdit(), your changes, save() and activate().
Your own DNS name and certificate
Point your DNS name at the instance, then run the following command, replacing the name:
sudo weblogic-set-host weblogic.example.comThis command generates a new self-signed certificate for the name, adds it to nginx, and sets it as WebLogic's front-end host. It also updates the URLs in /root/weblogic-credentials.txt and restarts the AdminServer, which takes about a minute.
To use a certificate from your own certificate authority instead, run the command first. Then replace /etc/nginx/ssl/weblogic.crt and /etc/nginx/ssl/weblogic.key (key owned by root:nginx, mode 0640), and run sudo systemctl reload nginx.
Change the administrator password
To replace the generated password with one of your own, reset it online with WLST, as in Step 8, reading the current password from a file. Then write the new password into boot.properties so the AdminServer can still start unattended. WebLogic encrypts the file on its next start. Finally, update the credentials file and restart:
sudo -u oracle /u01/app/oracle/product/oracle_common/common/bin/wlst.sh connect('weblogic', '<current-password>', 't3://127.0.0.1:7001') cd('/SecurityConfiguration/base_domain/Realms/myrealm/AuthenticationProviders/DefaultAuthenticator') cmo.resetUserPassword('weblogic', '<new-password>') disconnect() exit()
sudo -u oracle sh -c 'umask 077; cat > /u01/app/oracle/product/user_projects/domains/base_domain/servers/AdminServer/security/boot.properties' username=weblogic password=<new-password> (press Ctrl-D)
sudo sed -i 's/^WEBLOGIC_PASSWORD=.*/WEBLOGIC_PASSWORD=<new-password>/' /root/weblogic-credentials.txt
sudo systemctl restart weblogic.serviceTyping the password into the interactive WLST prompt and cat keeps it out of the command line history of other users. WebLogic locks an account for 30 minutes after five wrong passwords in a row.
Apply Oracle patches and Java updates
This image is built from Oracle's WebLogic Server 15.1.1.0.0 base release with no Patch Set Update (PSU) or other Oracle patch applied, because Oracle distributes WebLogic patches through My Oracle Support to licensed customers. Apply the current WebLogic PSU and security patches with your own Oracle support entitlement, following Oracle's patching documentation for Oracle Fusion Middleware (Patching with OPatch) and the quarterly Oracle Critical Patch Update advisories.
Stop the AdminServer first (sudo systemctl stop weblogic.service), apply the patch as the oracle user, and then start the AdminServer again.
Java updates come from Oracle Linux. WebLogic runs on Oracle Linux's OpenJDK 21 through the alternatives path /usr/lib/jvm/jre-21-openjdk, which points at the installed java-21-openjdk-headless package. dnf-automatic installs its security updates with the other Oracle Linux errata every day, or you can update by hand with sudo dnf -y update java-21-openjdk-headless. Nothing in WebLogic names the versioned JDK directory, so no WebLogic file changes. Restart the AdminServer so it runs on the new JDK:
sudo systemctl restart weblogic.serviceOracle Linux packages, including nginx, are updated the same way, with dnf-automatic daily or with sudo dnf -y update.
Check the installed versions and the JDK that the running AdminServer uses:
sudo setpriv --reuid=oracle --regid=oinstall --init-groups /usr/lib/jvm/jre-21-openjdk/bin/java -cp /u01/app/oracle/product/wlserver/server/lib/weblogic.jar weblogic.version | grep 'WebLogic Server' rpm -q java-21-openjdk-headless readlink -f /usr/lib/jvm/jre-21-openjdk
sudo /usr/local/sbin/weblogic-selftest | grep 'AdminServer JVM'WebLogic Server 15.1.1.0.0 Wed Oct 01 23:34:34 GMT 2025 2196592 java-21-openjdk-headless-21.0.12.1.1-1.2.0.1.el9.x86_64 /usr/lib/jvm/java-21-openjdk-21.0.12.1.1-1.2.0.1.el9.x86_64 AdminServer JVM: java.home=/usr/lib/jvm/java-21-openjdk-21.0.12.1.1-1.2.0.1.el9.x86_64 (java-21-openjdk-headless-21.0.12.1.1-1.2.0.1.el9.x86_64) java.vendor=Red Hat, Inc. java.vm.name=OpenJDK 64-Bit Server VM java.runtime.version=21.0.12.1+1-LTS; JAVA_HOME=/usr/lib/jvm/jre-21-openjdk (alternatives)The version numbers move on as Oracle Linux publishes OpenJDK updates. The java.vendor property reads "Red Hat, Inc." because Oracle Linux rebuilds the same OpenJDK sources. The package itself is Oracle Linux's, with vendor Oracle America.
Running WebLogic on Oracle JDK instead (Oracle support customers). Oracle's WebLogic Server 15.1.1 certification names Oracle JDK 17 and 21. If your Oracle support contract requires a certified JDK, install Oracle JDK yourself under your own Oracle entitlement. SecureAnyCloud does not supply it.
- Sign in to Oracle with your account, download the Oracle JDK 21 RPM for Linux x64 (
jdk-21_linux-x64_bin.rpm) under the terms your Oracle license gives you, and copy the file to the instance. - Install the RPM and find its directory:
bash sudo dnf -y install ./jdk-21_linux-x64_bin.rpm ORACLE_JDK=$(dirname "$(dirname "$(rpm -ql jdk-21 | grep '/bin/java$' | head -1)")"); echo "${ORACLE_JDK}"
- Point every place WebLogic reads JAVA_HOME at the new JDK (the systemd unit, the Oracle home, the domain scripts, the oracle user's profile and the SecureAnyCloud tools), and then restart:
bash sudo grep -rlF /usr/lib/jvm/jre-21-openjdk /etc/systemd/system/weblogic.service /u01/app/oracle/product/oui \ /u01/app/oracle/product/user_projects/domains/base_domain/bin /home/oracle/.bash_profile \ /usr/local/lib/sac/weblogic/common.sh | sudo xargs sed -i "s|/usr/lib/jvm/jre-21-openjdk|${ORACLE_JDK}|g" sudo systemctl daemon-reload sudo systemctl restart weblogic.service sudo /usr/local/sbin/weblogic-selftest | tail -2
weblogic-selftest first proves the login path as usual. It then stops at its last check with a FAIL: AdminServer JVM ... line, because that check expects Oracle Linux's OpenJDK. The line shows the java.home and VM name of the Oracle JDK that the AdminServer now runs on.
From then on, you update Oracle JDK under your Oracle entitlement. To go back, run the same sed with the two paths swapped.
Check the security model
Only SSH, HTTP and HTTPS listen on the network. The AdminServer listens on the loopback address only:
sudo ss -tlnH | awk '{print $4}' | sort -u0.0.0.0:22 0.0.0.0:443 0.0.0.0:80 [::]:22 [::]:443 [::]:80 [::ffff:127.0.0.1]:7001SSH accepts key logins only. Password and keyboard-interactive logins, root logins and X11 forwarding are off. The settings live in /etc/ssh/sshd_config.d/00-sac.conf, which sshd reads before any other file (sshd keeps the first value it reads). The sshd -T command shows the values sshd actually uses:
sudo sshd -T | grep -E '^(passwordauthentication|kbdinteractiveauthentication|permitrootlogin|x11forwarding|pubkeyauthentication) 'permitrootlogin no pubkeyauthentication yes passwordauthentication no kbdinteractiveauthentication no x11forwarding noA request for a host name the instance does not serve gets no answer (000 in curl):
curl -sk -o /dev/null -w "%{http_code}\n" -H "Host: attacker.example" https://127.0.0.1/ || echo "no answer, as intended"000 no answer, as intendedEvery process of the WebLogic and nginx services is blocked from the instance metadata service. This covers the AdminServer, every application you deploy, and the nginx master and workers. The rest of the instance can still use the metadata service, and first boot uses it to find the host name.
On Oracle Linux 9, systemd enforces the block. Both units carry IPAddressDeny= for the metadata addresses, which the kernel applies to everything in the unit's control group, whatever user it runs as:
sudo systemctl show -p IPAddressDeny weblogic.service nginx.serviceIPAddressDeny=168.63.129.16/32 fd00:ec2::254/128 169.254.169.254/32 IPAddressDeny=168.63.129.16/32 fd00:ec2::254/128 169.254.169.254/32systemd may list the three addresses in a different order.
To see the block in action, run a request from inside each service's control group and one from your own session. The result 000 means no answer:
for u in weblogic nginx; do
CG=$(systemctl show -p ControlGroup --value $u.service)
sudo bash -c "echo \$\$ > /sys/fs/cgroup$CG/cgroup.procs && exec curl -s -m 5 -o /dev/null -w 'inside $u.service: %{http_code}\n' -X PUT -H 'X-aws-ec2-metadata-token-ttl-seconds: 60' http://169.254.169.254/latest/api/token" done
sudo curl -s -m 5 -o /dev/null -w "outside the units: %{http_code}\n" -X PUT -H "X-aws-ec2-metadata-token-ttl-seconds: 60" http://169.254.169.254/latest/api/tokeninside weblogic.service: 000 inside nginx.service: 000 outside the units: 200If an application you deploy needs AWS credentials, give it its own credentials (for example AWS Secrets Manager or environment-specific access keys) rather than the instance role. Alternatively, you can knowingly override the setting with sudo systemctl edit weblogic.service, where an empty IPAddressDeny= line clears it.
SELinux is enforcing:
getenforceEnforcingRemote Console shows WebLogic's own security check as a banner at the top of every page, and the check is also available from the REST API. On this image the domain is created with WebLogic's default internal servlets disabled (DefaultInternalServletsDisabled, which turns off T3/IIOP tunnelling over HTTP and clears warning 091031). nginx also answers 404 for WebLogic's internal paths (/bea_wls_internal/, /bea_wls_deployment_internal/, /_async/, /wls-wsat/ and others).
The report is computed on demand, so refresh it first and then read it:
H=$(sudo cat /etc/sac/weblogic-host)
PW=$(sudo sed -n 's/^WEBLOGIC_PASSWORD=//p' /root/weblogic-credentials.txt)
curl -s -o /dev/null -w "refresh: %{http_code}\n" --cacert <(sudo cat /etc/nginx/ssl/weblogic.crt) --resolve "$H:443:127.0.0.1" -K <(printf 'user = "weblogic:%s"\n' "$PW") \
-H "X-Requested-By: sac" -H "Content-Type: application/json" -d '{}' -X POST \
"https://$H/management/weblogic/latest/domainRuntime/domainSecurityRuntime/refreshCache"
curl -s --cacert <(sudo cat /etc/nginx/ssl/weblogic.crt) --resolve "$H:443:127.0.0.1" -K <(printf 'user = "weblogic:%s"\n' "$PW") \
"https://$H/management/weblogic/latest/domainRuntime/domainSecurityRuntime?links=none&fields=securityValidationWarnings" | grep -E '"id"' unset PWrefresh: 200 "id": "091033" "id": "091032"Two items remain, and both follow from the design:
- 091033, no dedicated HTTPS network channel. HTTPS is terminated by nginx on port 443 and the AdminServer listens on
127.0.0.1:7001only, so no WebLogic network channel is reachable from the network at all. - 091032, demo identity and trust keystores. The AdminServer has no SSL listener of its own, so these keystores are not used to serve traffic. WebLogic 15.1.1 generates them, with the rest of the domain, on your instance's first boot, so they are unique to your instance rather than a shared demo key. If you enable SSL on a WebLogic network channel, configure your own identity and trust keystores first (
KeyStores=CustomIdentityAndJavaStandardTrustorCustomIdentityAndCustomTrust). Doing so also clears this item.
Managing the WebLogic services
The AdminServer and nginx are ordinary systemd services:
sudo systemctl status weblogic.service --no-pager --lines=0 | head -4● weblogic.service - Oracle WebLogic Server 15.1.1.0.0 AdminServer (base_domain, loopback 127.0.0.1:7001) Loaded: loaded (/etc/systemd/system/weblogic.service; enabled; preset: disabled) Drop-In: /etc/systemd/system/weblogic.service.d └─50-sac-imds-deny.confUse sudo systemctl restart weblogic.service, stop or start as needed. The AdminServer is back in RUNNING about 30 seconds after a start.
The server log is servers/AdminServer/logs/AdminServer.log under the domain. The HTTP access log, which records the real client address, is servers/AdminServer/logs/access.log. The AdminServer's Java heap is set in the unit (USER_MEM_ARGS=-Xms512m -Xmx2g). Raise it with sudo systemctl edit weblogic.service for larger instance types.
NodeManager is not configured in this single-server domain. If you add managed servers on this host, configure NodeManager to listen on 127.0.0.1 with its own credential, and keep port 5556 out of the security group.
Filesystem layout
These are the paths that matter:
- /usr/lib/jvm/jre-21-openjdk: Oracle Linux OpenJDK 21 (JAVA_HOME; alternatives link to the installed java-21-openjdk-headless)
- /u01/app/oracle/product: Oracle home (MW_HOME)
- /u01/app/oracle/product/wlserver: WebLogic Server (WL_HOME)
- /u01/app/oracle/product/user_projects/domains/base_domain: your domain (DOMAIN_HOME), created on first boot
- /u01/app/oraInventory: Oracle inventory
- /root/weblogic-credentials.txt: this instance's credentials (root only)
- /etc/nginx/ssl/weblogic.crt, weblogic.key: this instance's TLS certificate and key
- /etc/nginx/conf.d/weblogic-host.conf: nginx site for the configured host (written by first boot and weblogic-set-host)
- /usr/local/sbin/weblogic-set-host, weblogic-selftest: change the host name, and prove the login path
- /var/log/weblogic-firstboot.log: first boot log
- /usr/share/doc/sac/licenses/: Oracle and Java notices
The oracle user's ~/.bash_profile exports JAVA_HOME, MW_HOME, ORACLE_HOME, WL_HOME and DOMAIN_HOME.
Troubleshooting
The AdminServer does not start. Check the unit and the server log:
sudo journalctl -u weblogic.service -n 20 --no-pagerweblogic.service and nginx.service start only after first boot has created /var/lib/sac/data/weblogic-firstboot.done and the domain. If that file is missing, read /var/log/weblogic-firstboot.log.
The browser shows 502 Bad Gateway, or port 443 refuses the connection. First boot or the AdminServer is still starting, which takes about three minutes after launch. Wait a minute and reload.
No answer at all on 443 from your workstation. Check that the security group allows your address on 443. Also check that you use a host name the instance serves: the instance's public DNS name, its public or private address, or the name you set with weblogic-set-host.
Security recommendations
- Allow 443 only from the networks that use WebLogic, and 22 only from your administration networks.
- Replace the self-signed certificate with one from your certificate authority for production (Step 9).
- Create separate users and groups in the security realm for operators and deployers instead of sharing the
weblogicaccount. - Apply Oracle's WebLogic PSUs and Critical Patch Updates with your Oracle support entitlement (Step 11).
Support and licensing
SecureAnyCloud provides 24/7 technical support for this image by email and live chat: sales@secureanycloud.com or secureanycloud.com/support. Licensing questions about Oracle software go to Oracle.
Using Oracle WebLogic Server requires your own Oracle license. The Java runtime is Oracle Linux's OpenJDK 21 (GPLv2 with the Classpath Exception), and no Oracle JDK is included. Oracle WebLogic Server documentation is at docs.oracle.com.
Oracle, Java and WebLogic are registered trademarks of Oracle and/or its affiliates. SecureAnyCloud is not affiliated with or endorsed by Oracle.
Deploy on AWS
Launch WebLogic Server 15.1.1.0.0 on Oracle Linux 9 on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com