sftpd config: MaxAuthTries is now configurable

This commit is contained in:
Nicola Murino 2019-07-21 12:02:24 +02:00
parent 6053a0617f
commit 5c861a7c46
5 changed files with 17 additions and 13 deletions

View file

@ -61,6 +61,7 @@ The `sftpgo.conf` configuration file contains the following sections:
- `bind_port`, integer the port used for serving SFTP requests. Default: 2022 - `bind_port`, integer the port used for serving SFTP requests. Default: 2022
- `bind_address`, string. Leave blank to listen on all available network interfaces. Default: "" - `bind_address`, string. Leave blank to listen on all available network interfaces. Default: ""
- `idle_timeout`, integer. Time in minutes after which an idle client will be disconnected. Default: 15 - `idle_timeout`, integer. Time in minutes after which an idle client will be disconnected. Default: 15
- `max_auth_tries` integer. Maximum number of authentication attempts permitted per connection. If set to a negative number, the number of attempts are unlimited. If set to zero, the number of attempts are limited to 6.
- `umask`, string. Umask for the new files and directories. This setting has no effect on Windows. Default: "0022" - `umask`, string. Umask for the new files and directories. This setting has no effect on Windows. Default: "0022"
- **"data_provider"**, the configuration for the data provider - **"data_provider"**, the configuration for the data provider
- `driver`, string. Supported drivers are `sqlite`, `mysql`, `postgresql` - `driver`, string. Supported drivers are `sqlite`, `mysql`, `postgresql`

View file

@ -31,6 +31,7 @@ func init() {
BindPort: 2022, BindPort: 2022,
BindAddress: "", BindAddress: "",
IdleTimeout: 15, IdleTimeout: 15,
MaxAuthTries: 0,
Umask: "0022", Umask: "0022",
}, },
ProviderConf: dataprovider.Config{ ProviderConf: dataprovider.Config{
@ -74,13 +75,13 @@ func LoadConfig(configPath string) error {
//globalConf.basePath = basePath //globalConf.basePath = basePath
file, err := os.Open(configPath) file, err := os.Open(configPath)
if err != nil { if err != nil {
logger.Warn(logSender, "error loading configuration file: %v. Default configuration will be used", err) logger.Warn(logSender, "error loading configuration file: %v. Default configuration will be used: %+v", err, globalConf)
return err return err
} }
defer file.Close() defer file.Close()
err = json.NewDecoder(file).Decode(&globalConf) err = json.NewDecoder(file).Decode(&globalConf)
if err != nil { if err != nil {
logger.Warn(logSender, "error parsing config file: %v", err) logger.Warn(logSender, "error parsing config file: %v. Default configuration will be used: %+v", err, globalConf)
return err return err
} }
logger.Debug(logSender, "config loaded: %+v", globalConf) logger.Debug(logSender, "config loaded: %+v", globalConf)

View file

@ -138,7 +138,7 @@ func (c Connection) Filewrite(request *sftp.Request) (io.WriterAt, error) {
} }
if statErr != nil { if statErr != nil {
logger.Error("error performing file stat %v: %v", p, statErr) logger.Error(logSender, "error performing file stat %v: %v", p, statErr)
return nil, sftp.ErrSshFxFailure return nil, sftp.ErrSshFxFailure
} }
@ -149,7 +149,7 @@ func (c Connection) Filewrite(request *sftp.Request) (io.WriterAt, error) {
// Not sure this would ever happen, but lets not find out. // Not sure this would ever happen, but lets not find out.
if stat.IsDir() { if stat.IsDir() {
logger.Warn("attempted to open a directory for writing to: %v", p) logger.Warn(logSender, "attempted to open a directory for writing to: %v", p)
return nil, sftp.ErrSshFxOpUnsupported return nil, sftp.ErrSshFxOpUnsupported
} }

View file

@ -30,6 +30,7 @@ type Configuration struct {
BindPort int `json:"bind_port"` BindPort int `json:"bind_port"`
BindAddress string `json:"bind_address"` BindAddress string `json:"bind_address"`
IdleTimeout int `json:"idle_timeout"` IdleTimeout int `json:"idle_timeout"`
MaxAuthTries int `json:"max_auth_tries"`
Umask string `json:"umask"` Umask string `json:"umask"`
} }
@ -43,7 +44,7 @@ func (c Configuration) Initialize(configDir string) error {
} }
serverConfig := &ssh.ServerConfig{ serverConfig := &ssh.ServerConfig{
NoClientAuth: false, NoClientAuth: false,
MaxAuthTries: 10, MaxAuthTries: c.MaxAuthTries,
PasswordCallback: func(conn ssh.ConnMetadata, pass []byte) (*ssh.Permissions, error) { PasswordCallback: func(conn ssh.ConnMetadata, pass []byte) (*ssh.Permissions, error) {
sp, err := c.validatePasswordCredentials(conn, pass) sp, err := c.validatePasswordCredentials(conn, pass)
if err != nil { if err != nil {

View file

@ -3,6 +3,7 @@
"bind_port":2022, "bind_port":2022,
"bind_address": "", "bind_address": "",
"idle_timeout": 15, "idle_timeout": 15,
"max_auth_tries": 0,
"umask": "0022" "umask": "0022"
}, },
"data_provider": { "data_provider": {