Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Apache MINA SFTP Example

I'm trying to set up an SFTP server with multiple users that each have their own home directory.

I read this answer which explained how to set a virtual directory for a single user but I'm not sure how to have multiple users each with their own home directory.

Can someone please tell me how to go about this?

like image 332
Hooli Avatar asked Jul 18 '16 16:07

Hooli


2 Answers

I finally got it working. Here is a working example:

pom.xml

 <dependency>
    <groupId>org.apache.sshd</groupId>
    <artifactId>sshd-core</artifactId>
    <version>0.14.0</version>
</dependency>

Test.java

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.sshd.SshServer;
import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory;
import org.apache.sshd.server.Command;
import org.apache.sshd.server.PasswordAuthenticator;
import org.apache.sshd.server.UserAuth;
import org.apache.sshd.server.auth.UserAuthPassword;
import org.apache.sshd.server.command.ScpCommandFactory;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.apache.sshd.server.session.ServerSession;
import org.apache.sshd.server.sftp.SftpSubsystem;

public class Test {

    public static void main(String args[]) {
        try {
            Runtime.getRuntime().exec("sudo fuser -k " + "2222" + "/tcp");
        } catch (IOException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }

        File TEST = new File("test");
        File ADMIN = new File("admin");
        File ERROR = new File("error");

        TEST.mkdirs();
        ADMIN.mkdirs();
        ERROR.mkdirs();

        SshServer sshServer = SshServer.setUpDefaultServer();
        sshServer.setFileSystemFactory(new VirtualFileSystemFactory(ERROR.getAbsolutePath()));
        sshServer.setPort(2222);
        sshServer.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File("my.pem").getAbsolutePath()));
        sshServer.setCommandFactory(new ScpCommandFactory());
        List<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<>();
        userAuthFactories.add(new UserAuthPassword.Factory());
        sshServer.setUserAuthFactories(userAuthFactories);
        sshServer.setPasswordAuthenticator(new PasswordAuthenticator() {
            @Override
            public boolean authenticate(String username, String password, ServerSession session) {
                if ((username.equals("test")) && (password.equals("test"))) {
                    sshServer.setFileSystemFactory(new VirtualFileSystemFactory(TEST.getAbsolutePath()));
                    return true;
                }
                if ((username.equals("admin")) && (password.equals("admin"))) {
                    sshServer.setFileSystemFactory(new VirtualFileSystemFactory(ADMIN.getAbsolutePath()));
                    return true;
                }
                return false;
            }
        });
        List<NamedFactory<Command>> namedFactoryList = new ArrayList<>();
        namedFactoryList.add(new SftpSubsystem.Factory());
        sshServer.setSubsystemFactories(namedFactoryList);
        try {
            sshServer.start();
        } catch (IOException ex) {
            Logger.getLogger(CarrierSFTPServer.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}
like image 121
Hooli Avatar answered Sep 28 '22 00:09

Hooli


Updated version of above (as of 1.4.0 of sshd-core). Note that I did not specify a file for the host key provider since mine was for a Junit integration test.

List<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<NamedFactory<UserAuth>>();
userAuthFactories.add(new UserAuthPasswordFactory());

List<NamedFactory<Command>> sftpCommandFactory = new ArrayList<NamedFactory<Command>>();
sftpCommandFactory.add(new SftpSubsystemFactory());

SshServer sshd = SshServer.setUpDefaultServer();
sshd.setPort(22);
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider());
sshd.setUserAuthFactories(userAuthFactories);
sshd.setCommandFactory(new ScpCommandFactory());
sshd.setSubsystemFactories(sftpCommandFactory);
sshd.setPasswordAuthenticator(new PasswordAuthenticator() {
  @Override
  public boolean authenticate(String username, String password, ServerSession session) {
    if ((username.equals("admin")) && (password.equals("admin"))) {
      sshd.setFileSystemFactory(new VirtualFileSystemFactory(new File("C:\\devl").toPath()));
      return true;
    }
    return false;
  }
});

sshd.start();
like image 44
Skeeterdrums Avatar answered Sep 27 '22 22:09

Skeeterdrums