| Tested on | RHEL 10.2 (Coughlan) on vm1.lab.example |
|---|---|
| Package | vsftpd-3.0.5-12.el10, sssd-ad, realmd |
| Applies to | RHEL 10 hosts already joined to AD with realmd and SSSD |
| Privilege | sudo for vsftpd, firewall, and SELinux |
| Scope | Legacy FTP and vsftpd logins for AD users through the system PAM stack and SSSD. Covers package install, vsftpd options, PAM inspection, realm permit, SELinux, passive ports, and verification. Does not replace the domain join walkthrough. Plain FTP sends credentials in cleartext unless you add TLS; prefer SFTP for new designs. |
| Related guides | Join RHEL to AD with realmd and SSSD SFTP for Active Directory users Samba shares for AD users Join with Samba Winbind OpenSSH authentication methods |
vsftpd does not connect to Active Directory itself. It asks PAM to authenticate the login, and PAM can use SSSD to check the AD account. If id jane@lab.example already works on the server, the AD side of the setup is mostly done.
Red Hat lists vsftpd among deprecated FTP-related components in RHEL 10. Use this setup only when an existing application or client still requires FTP or FTPS. For a new file-transfer service, use SFTP over OpenSSH instead.
Quick answer
FTP client
↓
vsftpd
↓
/etc/pam.d/vsftpd
↓
password-auth (pam_sss)
↓
SSSD
↓
Active DirectoryBefore touching vsftpd, make sure the Linux server can already find and authenticate the AD user through SSSD.
FTP, FTPS, and SFTP
| Protocol | Encryption | Typical server | Recommendation |
|---|---|---|---|
| FTP | Cleartext by default | vsftpd | Legacy only |
| FTPS | TLS on FTP | vsftpd | When FTP is mandatory |
| SFTP | SSH transport | sshd |
Preferred on RHEL 10 |
SFTP is a different protocol from FTP. It runs through OpenSSH on port 22 and does not use vsftpd. See SFTP with Active Directory for the modern approach.
Test environment
| Item | Value |
|---|---|
| OS | RHEL 10.2, vm1.lab.example |
| Domain | lab.example / LAB.EXAMPLE |
| Integration | realmd + SSSD (client-software: sssd) |
| Sample user | jane@lab.example |
| vsftpd | vsftpd-3.0.5-12.el10 |
Prerequisite: verify Active Directory on Linux
This article assumes the server uses SSSD for AD logins. Check that first:
realm listlab.example
type: kerberos
realm-name: LAB.EXAMPLE
domain-name: lab.example
configured: kerberos-member
client-software: sssd
login-formats: %U@lab.example
login-policy: allow-realm-loginsclient-software: sssd is the important line here.
Check that Linux can find the AD user:
id jane@lab.exampleuid=758601105(jane@lab.example) gid=758600513(domain users@lab.example) groups=758600513(domain users@lab.example),758601103(network-admins@lab.example)If this command fails, fix the AD join before continuing. vsftpd cannot authenticate an account that Linux cannot resolve.
Finally, make sure SSSD can currently reach a domain controller:
sudo sssctl domain-status lab.exampleOnline status: Online
...
AD Domain Controller: win-8s0k67ep5eo.lab.exampleInstall vsftpd
Install the package from the RHEL 10 repositories:
sudo dnf install -y vsftpdInstalled:
vsftpd-3.0.5-12.el10.x86_64vsftpd is deprecated in RHEL 10. It is still available, but do not choose it for a new file-transfer service unless you have a specific FTP compatibility requirement.
When a user logs in, vsftpd hands the username and password to PAM:
ls -l /etc/pam.d/vsftpd-rw-r--r--. 1 root root 335 Jan 16 2026 /etc/pam.d/vsftpdConfigure vsftpd for authenticated users
For this AD login test, make sure these options are present in /etc/vsftpd/vsftpd.conf:
anonymous_enable=NO
local_enable=YES
write_enable=YESlocal_enable=YES allows users that PAM can authenticate. That includes AD users provided by SSSD; they do not have to be manually created in /etc/passwd.
Add a passive port range so the data channel can traverse firewalls:
pasv_enable=YES
pasv_min_port=21100
pasv_max_port=21110FTP uses a separate connection for directory listings and file transfers. Limiting passive mode to a known port range makes those data connections easier to allow through the firewall. Without the passive ports open, login may succeed while ls, uploads, or downloads appear to hang. Set pasv_address only when clients need the server to advertise a particular reachable address, such as behind NAT. Open the same port range in firewalld.
This walkthrough does not enable chroot_local_user; omit allow_writeable_chroot unless you deliberately chroot users into their home directories.
How PAM reaches Active Directory
Inspect the service PAM file instead of pasting standalone pam_sss.so lines from older tutorials:
cat /etc/pam.d/vsftpdauth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session include password-authThe password-auth lines are important. On an authselect-managed RHEL system joined with SSSD, that common PAM file already contains the SSSD integration. You normally do not need to add pam_sss.so directly to /etc/pam.d/vsftpd.
pam_shells.so allows login only when the user’s resolved shell appears in /etc/shells. If SSSD returns /bin/bash, confirm /bin/bash is listed there. An AD account can resolve with id yet still fail vsftpd at the PAM shell check.
Allow the AD user through SSSD account checks
PAM performs more than a password check. The password can be correct but the later account check can still deny the login because of access policy. If the log shows pam_sss(vsftpd:account): Access denied, allow the user through realm permit:
sudo realm permit jane@lab.exampleFor several users, permit an AD group with realm permit -g 'group@lab.example' instead of adding accounts one at a time.
SELinux and firewall
Inspect FTP-related booleans before you change anything:
getsebool -a | grep ftpdDo not enable ftpd_full_access by default. It broadly relaxes SELinux confinement for the FTP daemon. Try the upload first. If SELinux blocks it, check recent AVC denials before enabling a broad boolean:
sudo ausearch -m avc -ts recentPrefer fixing the directory label or enabling a narrowly scoped option when possible.
In this test environment, uploads into Jane’s normal SSSD-created home directory were blocked until ftpd_full_access was enabled:
sudo setsebool -P ftpd_full_access onThat is a broad permission. A dedicated FTP directory with appropriate SELinux context is preferable when you can use one.
Allow FTP and the passive range:
sudo firewall-cmd --permanent --add-service=ftpOpen the passive data port range you configured in vsftpd.conf:
sudo firewall-cmd --permanent --add-port=21100-21110/tcpReload firewalld so both rules are active:
sudo firewall-cmd --reloadStart vsftpd and verify the listener
Start vsftpd and enable it at boot:
sudo systemctl enable --now vsftpdCheck that the service started successfully:
sudo systemctl status vsftpd --no-pagerConfirm port 21 is listening:
ss -ltnp | grep ':21'LISTEN 0 32 *:21 *:* users:(("vsftpd",pid=85804,fd=3))Test login with an Active Directory user
Use the same fully qualified username that worked with id, for example jane@lab.example. Pass only the username to curl; it will prompt for the password so the AD password does not appear in shell history:
curl -u 'jane@lab.example' ftp://127.0.0.1/If curl returns a directory listing, vsftpd accepted the login and PAM allowed the AD account.
Upload a test file the same way:
curl -u 'jane@lab.example' -T /etc/hostname ftp://127.0.0.1/ftp-hostname-test.txtCheck that the uploaded file appeared in Jane’s home directory:
ls "/home/jane@lab.example/"ftp-hostname-test.txtCheck vsftpd logs when a login fails:
sudo journalctl -u vsftpd -n 10 --no-pagerpam_sss(vsftpd:auth): authentication success; ... user=jane@lab.exampleIf authentication succeeds but the next PAM message denies the account, the problem is access policy rather than the password check. Review realm permit or the SSSD access rules instead of adding another pam_sss.so line.
Secure FTP with TLS when FTP is mandatory
Plain FTP exposes credentials on the wire. When a client cannot move to SFTP, enable FTPS with a server certificate, ssl_enable=YES, and force encryption for login and data channels. FTPS configuration varies with the certificate and client, so this article does not try to turn the FTP authentication example into a full TLS setup guide.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
id cannot find the user |
SSSD or join | realmd guide |
530 Login incorrect after good password |
PAM account denial | realm permit, SSSD access rules, /etc/vsftpd/ftpusers |
| Password accepted in PAM logs but FTP still returns 530 | pam_shells or ftpusers |
Shell in /etc/shells; remove user from ftpusers |
| Listing hangs after login | Passive ports / firewall | pasv_min_port / pasv_max_port and firewall-cmd |
| Upload fails | Uploads disabled, filesystem permission, or SELinux | write_enable; directory permissions; ftpd_full_access |
Should you use vsftpd with Active Directory in 2026?
Keep vsftpd when an existing application or device still requires FTP or FTPS. For a new setup, use SFTP instead.
Summary
With this setup, vsftpd does not connect to AD directly. It asks PAM to authenticate the user, and PAM reaches Active Directory through SSSD.
Start by making sure id user@domain works, check the existing /etc/pam.d/vsftpd file, and only troubleshoot vsftpd after the AD account works on Linux. Because vsftpd is deprecated and plain FTP is unencrypted, keep it only for compatibility. Use SFTP when you can choose the client and server protocol.
References
- Red Hat Enterprise Linux 10 — Managing FTP servers
- Red Hat Enterprise Linux 10 — Integrating Linux systems with Active Directory
Frequently Asked Questions
Can vsftpd authenticate Active Directory users?
Yes, when the host is joined with SSSD and PAM includes the password-auth stack that reaches pam_sss.
Does vsftpd connect directly to Active Directory?
No. vsftpd uses PAM; SSSD performs the AD authentication.
Why does id work but FTP login fail?
Password authentication may succeed while the PAM account check denies the user. Check realm permit, SSSD access rules, and /etc/vsftpd/ftpusers.
Can I use an AD group to restrict FTP access?
Yes, with realm permit -g or SSSD simple access rules for the accounts that should use FTP.
Is vsftpd deprecated in RHEL 10?
Red Hat documents vsftpd as deprecated in RHEL 10. Plan migration to SFTP or another supported protocol.
Should I use FTP, FTPS, or SFTP with Active Directory?
Prefer SFTP over OpenSSH for new deployments. Use FTPS only when FTP is required and TLS is configured.

