However, Bottas will start the race from the back of the grid due to penalties, which promotes Max Verstappen on to the front row for the start of Sunday's race.
Ferrari's challenge fell away during the session, with the Maranello squad almost half a second down on Hamilton.
Charles Leclerc was fourth fastest, however, he failed to set a second lap in Q3 as he crossed the timing line too late after the pack got bunched up in the final sector.
Leclerc complained over the radio that it was Vettel who held him up, as the German was ahead of him on the circuit.
Vettel managed to get to the line before the chequered flag was waved but failed to improve on his best lap time, which saw him end the session in fifth.
Alexander Albon was sixth fastest in the session but was quite a bit down on teammate Max Verstappen. The Thai-British driver, who is signed up for Red Bull next year, was almost one second down on pole position.
Lando Norris and Carlos Sainz were 10-10 in qualifying heading into the final round, however it was the rookie who prevailed and took the spoils.
In what is his last race with Renault, Nico Hulkenberg managed to progress into the top-ten shootout, but couldn't move of tenth place, setting a lap time that was three-tenths down on his teammate Ricciardo's.
Romain Grosjean failed to make it out of Q1 for Haas, and was involved in a pit lane incident with Daniil Kvyat during the session, which saw him take avoiding action as Kvyat emerged from his garage.
Bahrain International Circuit - Winter testing