Break up into three booleans to aid understanding?
```
boolean groupIdsMatchSourceTags = ...;
boolean cidrBlocksMatchSourceRanges = ...;
boolean firewallHasPortRange = ...;
return groupIdsMatchSourceTags  && cidrBlocksMatchSourceRanges  
         && hasProtocol(permission.getIpProtocol()).apply(input) && firewallHasPortRange;
```